【问题标题】:Preventing Meteor from removing MiniMongo data already sent to client when publish changes防止 Meteor 在发布更改时删除已发送到客户端的 MiniMongo 数据
【发布时间】:2015-07-17 07:34:12
【问题描述】:

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

【问题讨论】:

    标签: javascript meteor reactive-programming meteor-publications


    【解决方案1】:

    当您在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} 
        });
    });
    

    【讨论】:

    • 有趣!我喜欢这两种解决方案,尽管我不完全确定第二个是否可行:Meteor 不会首先从旧订阅/出版物中删除内容并重新转移它吗?这正是我想要避免的!
    • 取决于您对工作的定义;-)。是的,它可能会再次通过网络发送所有数据。对于某些用例,这可能比管理 subHandles 更好。
    • 嗯,它(第二种解决方案)有点不符合我的要求 - 因为严格来说,它不会阻止 Meteor 删除已经发送的文件。它只是重新发送它们。您可以在回答中指出这一点。但是很好的解释,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-12-25
    • 2016-10-19
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多