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

标签 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 的文档都将被删除(如果它们不是新光标的一部分)。在某些情况下,这是您想要的,但我的问题很简单:我可以阻止这种情况吗?怎么办?

最佳答案

当您在 Tracker.autorun 中执行 Meteor.subscribe 时,这里会发生一些神奇的事情。基本上,它会在每次运行后 .stop() 旧订阅。

你有两个选择,

1- 使用 nonreactive block 保持多个订阅处于事件状态。

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

关于javascript - 发布更改时防止 Meteor 删除已发送到客户端的 MiniMongo 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31464548/

相关文章:

javascript - 使用 rxjs 按阈值展平数值序列

javascript - 禁用文本选择并添加异常(exception)

javascript - JavaScript 中的问题

javascript - Meteor 中的数据上下文渲染回调不可靠

jquery - 如何在 Meteor.js 上应用 jQuery

javascript - 如何手动销毁ReactiveDict?

c# - C#/WinRT 中的全局状态对象

php - 在线购物车付款

javascript - Ajax 请求中的toggleClass 不起作用

javascript - Meteor 你的应用程序崩溃了