2

我注意到,当我更改已发布的光标时——不是光标指向的数据,而是整个光标——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将被删除(如果它们不是新光标的一部分)。在某些情况下,这是您想要的,但我的问题很简单:我可以阻止这种情况吗?如何?

4

1 回答 1

2

当你Meteor.subscribeTracker.autorun. 基本上,它会.stop()在每次运行后进行旧订阅。

你有两个选择,

nonreactive1- 通过使用一个块来保持多个订阅处于活动状态。

注意:您必须编写一些代码来清理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} 
    });
});
于 2015-07-16T22:08:00.577 回答