Javascript 防止Meteor在发布更改时删除已发送到客户端的MiniMongo数据
我注意到,当我更改已发布的游标时,不是游标指向的数据,而是整个游标,Meteor将向客户端发送一条Javascript 防止Meteor在发布更改时删除已发送到客户端的MiniMongo数据,javascript,meteor,reactive-programming,meteor-publications,Javascript,Meteor,Reactive Programming,Meteor Publications,我注意到,当我更改已发布的游标时,不是游标指向的数据,而是整个游标,Meteor将向客户端发送一条removed消息,显示所有未出现在新游标中的文档。 用更专业的术语来说,我的意思是: // client side Tracker.autorun(function() { var someReactiveVar = someReactiveVar.get(); Meteor.subscribe('myPublication', someReactiveVar); } ... /
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
发生更改时,已发送到客户端MiniMongomyCollection
的所有文档都将被删除(如果它们不是新游标的一部分)。在某些情况下,这是你想要的,但我的问题只是:我能防止这种情况吗?怎么做?当你在跟踪器中执行Meteor.subscribe
时,这里发生了一些神奇的事情。基本上,它将在每次运行后.stop()
旧订阅
你有两个选择
1-通过使用非反应
块,使多个订阅保持活动状态
注意:您必须编写一些代码来清理子句柄
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}
});
});
有趣!我喜欢这两种解决方案,尽管我不能完全确定第二种方案是否有效:Meteor是否会首先从旧订阅/出版物中删除内容并重新传输?这正是我想要避免的!取决于您对工作的定义;-)。是的,它可能会再次发送所有数据。对于某些用例,这可能比管理子句柄
更可取。它(第二种解决方案)并不能满足我的要求,因为严格来说,它不能阻止Meteor删除已经发送的文档。它只是重新发送它们。你可以在回答中指出这一点。但是很好的解释,谢谢!