i have publication receives parameter subscription determine how many records return array inside collection (using $slice). issue have data not refreshed on template when new parameter sent through subscription. code:
publication:
meteor.publish('conversations', function (record_limit) { var bunchsize = 50; var multiplier = 1; if (record_limit) { multiplier = record_limit; } var publimit = bunchsize * multiplier; return conversations.find({users:{$in:[this.userid]}},{fields:{"lstmsg":1, "msg":{"$slice":-publimit}}}); }); trigger load more array objects:
var convcounter = 1; template.conversation.events({ 'click .js-loadmore': function() { convcounter = convcounter + 1; deps.autorun(function() { meteor.subscribe("conversations",convcounter); }); } }); any advice why subscription not being refreshed on template? shows 50 items "msg" field while has more 200 items on it. in advance.
try using reactivevar instead , wrapping subscription in autorun inside template's oncreated callback.
template.conversation.oncreated(function() { this.convcounter = new reactivevar(1); this.autorun(() => { this.subscribe('conversations', this.convcounter.get()); }); }); template.conversation.events({ 'click .js-loadmore': function(event, instance) { instance.convcounter.set(instance.convcounter.get() + 1); } }); as process click event update reactivevar in tern cause previous publication stop , start new 1 (with new $slice value).
you have modify publication , use lower level api in order trick mergebox send down sub-field changes client (otherwise, if re-subscribe new record_limit value client record not updated msg sub-field values). note, approach viable if subscribing client uses data in "read only" fashion because modify _id field being sent down in order trick mergebox.
meteor.publish('conversations', function (record_limit) { var bunchsize = 50; var multiplier = 1; if (record_limit) { multiplier = record_limit; } var publimit = bunchsize * multiplier; const handle = conversations.find({ users: { $in: [this.userid] } }, { fields: { "lstmsg": 1, "msg": { "$slice": -publimit } } }).observe({ added: (doc) => { this.added("conversations", doc._id + publimit, doc); }, changed: (newdoc, olddoc) => { this.changed("conversations", newdoc._id + publimit, newdoc); }, removed: (olddoc) => { this.removed("conversations", olddoc._id + publimit); }, }); this.ready(); this.onstop(() => { handle.stop(); }); }); the theory upon re-subscription new record_limit argument, data loaded on client (from previous subscription) thrown away , replaced new data because doc _id field different (since have used record_limit part of id).
Comments
Post a Comment