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

时间:2015-07-16 21:07:59

标签: javascript meteor reactive-programming meteor-publications

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

1 个答案:

答案 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} 
    });
});