Javascript 防止Meteor在发布更改时删除已发送到客户端的MiniMongo数据

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); } ... /

我注意到,当我更改已发布的游标时,不是游标指向的数据,而是整个游标,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
的所有文档都将被删除(如果它们不是新游标的一部分)。在某些情况下,这是你想要的,但我的问题只是:我能防止这种情况吗?怎么做?

当你在
跟踪器中执行
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删除已经发送的文档。它只是重新发送它们。你可以在回答中指出这一点。但是很好的解释,谢谢!