Meteor Blaze Subscription.ready()似乎触发了自动运行。

时间:2017-04-08 21:43:25

标签: meteor meteor-blaze

我现在已经在我的Meteor / Blaze应用程序中使用this模式进行模板级订阅。

然而,在升级到Meteor 1.4.3.2后,我的某个模板似乎有一个奇怪的错误。

我有这个出版物:

Meteor.publish('reports.byId', function(reportId){
  console.log("subscribe reports.byId", reportId);
  const reports = Reports.find({_id: reportId});
  console.log(reports.count());
  return reports;
});

我已经删除了对用户权限的任何验证,并添加了写入以检查我是否真正获得了数据等。

现在我使用这个onCreated方法调用它:

Template.manageReport.onCreated(function(){
  const instance = this;
  const reportId = FlowRouter.getParam("reportId");
  instance.autorun(function(){
    const reportSub = instance.subscribe('reports.byId', reportId);
    if (reportSub.ready()){
      console.log("ready");
    }
  });
});

奇怪的是:如果我删除了检查订阅是否准备就绪,一切都按预期工作。一旦我检查订阅准备就绪,订阅就永远不会准备好,我可以通过服务器上的日志消息看到请求订阅的速度是每秒几十次。

1 个答案:

答案 0 :(得分:0)

是的,reportSub.ready()是被动的,因此它会触发自动运行。实际上它是触发你自动运行的唯一因素。订阅准备好后,它会触发自动运行,然后它就不再准备就绪,因为你刚刚再次调用它。这是一个循环。

我认为你不应该打电话给instance.subscribe并在同一个自动运行中检查它的准备情况。

由于reportId是一个路由参数,并且它不会改变,因此您不需要为订阅自动运行。如果任何参数是可能发生变化的反应变量,则只需要它。

这应该可以正常工作。让我知道它是怎么回事。

Template.manageReport.onCreated(function() {
  const instance = this;
  const reportId = FlowRouter.getParam("reportId");

  // Create subscription
  const reportSub = instance.subscribe('reports.byId', reportId);

  // Check when subscription is ready
  instance.autorun(function() {
    if (reportSub.ready()) {
      console.log("ready");
    }
  });
});