【问题标题】:Meteor Blaze Subscription.ready() seems to trigger autorun.Meteor Blaze Subscription.ready() 似乎触发了自动运行。
【发布时间】:2017-09-04 04:03:09
【问题描述】:

我已经使用this 模式在我的 Meteor/Blaze 应用程序中进行模板级订阅已有无数个月了。

但是,在升级到 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");
    }
  });
});

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

【问题讨论】:

  • 升级前你的 Meteor 版本是多少?
  • 1.3.x 我相信。抱歉,我实际上没有将 .meteor 文件夹置于版本控制之下。

标签: meteor meteor-blaze


【解决方案1】:

是的,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");
    }
  });
});

【讨论】:

  • 好的。现在我首先拥有这个的原因是,我在报告中有几个要创建订阅的引用,这些引用应该在报告可用后立即运行。我也不明白为什么discovermeteor.com/blog/template-level-subscriptions 似乎可以在我以前使用过的很多地方工作。
猜你喜欢
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
相关资源
最近更新 更多