我注意到当我更改发布的光标时 - 不是光标指向的数据,而是整个光标 - Meteor将向客户端发送removed
消息,以查找未出现在新光标中的所有文档光标。
我的意思是更多技术术语:
// client side
Tracker.autorun(function() {
var someReactiveVar = someReactiveVar.get();
Meteor.subscribe('myPublication', someReactiveVar);
}
...
// server side
Meteor.publish('myPublication', function() {
var someParameter = arguments[0];
return myCollection.find({ someAttribute: someParameter });
});
现在,当someReactiveVar
发生更改时,将删除已发送到客户端MiniMongo myCollection
的所有文档(如果它们不是新游标的一部分)。在某些情况下,这是你想要的,但我的问题只是:我可以阻止这个吗?怎么样?
答案 0 :(得分:2)
当您在Meteor.subscribe
内执行Tracker.autorun
时,会发生一些神奇的事情。基本上,它会在每次运行后.stop()
旧订阅。
您有两种选择,
1-使用nonreactive
块保持多个订阅活着。
注意:您必须编写一些代码来清理subHandles
。
var subHandles = [];
Tracker.autorun(function(){
var someReactiveVal = someReactiveVar.get();
Tracker.nonreactive(function(){
var subHandle = Meteor.subscribe('myPublication', someReactiveVal);
subHandles.push(subHandle);
});
});
2-让您的订阅具有多个值,例如
注意:这将使客户端上的两组数据都可用,但可能无法阻止它重新传输。
Template.myTemplate.events({
'click mybutton': function(){
var newVal = getNewVal();
var arrayOfValues = someReactiveVar.get();
arrayOfValues.push(newVal);
someReactiveVar.set(arrayOfValues);
}
})
// client side
Tracker.autorun(function() {
var arrayOfValues = someReactiveVar.get();
Meteor.subscribe('myPublication', arrayOfValues);
}
...
// server side
Meteor.publish('myPublication', function(arrayOfValues) {
return myCollection.find({
someAttribute: {$in: arrayOfValues}
});
});