我注意到,当我更改已发布的光标时 - 不是光标指向的数据,而是整个光标 - 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
的文档都将被删除(如果它们不是新光标的一部分)。在某些情况下,这是您想要的,但我的问题很简单:我可以阻止这种情况吗?怎么办?
最佳答案
当您在 Tracker.autorun
中执行 Meteor.subscribe
时,这里会发生一些神奇的事情。基本上,它会在每次运行后 .stop()
旧订阅。
你有两个选择,
1- 使用 nonreactive
block 保持多个订阅处于事件状态。
注意:您必须编写一些代码来清理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}
});
});
关于javascript - 发布更改时防止 Meteor 删除已发送到客户端的 MiniMongo 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31464548/