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

Preventing Meteor from removing MiniMongo data already sent to client when publish changes

我注意到,当我更改已发布的游标时 - 不是游标指向的数据,而是整个游标 - 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 块使多个订阅保持活动状态。

注意:您必须编写一些代码来清理 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} 
    });
});