Meteor Iron 路由器 WaitOn 订阅

Meteor Iron Router WaitOn Subscription

在将 data 返回到模板之前,我真的很难等待订阅加载特定路由。我可以从服务器上的发布上看到找到了文档,但是在客户端上没有文档。

如果我在发布时执行 find().count(),它显示找到 1 个文档,这是正确的,但是当我在订阅上执行计数时,它显示 0 个文档。

我尝试了很多不同的方法,比如使用 subscriptions:function() 而不是 waitOn:function(),但没有任何效果。

Collections.js 库:

SinglePackage = new Mongo.Collection("SinglePackage");
SinglePackage.allow({
  insert: function(){
    return true;
  },
  update: function(){
    return true;
  },
  remove: function(){
    return true;
  }
});

Publications.js 服务器:

Meteor.publish("SinglePackage", function(pack_id) {
 return Packages.find({shortId: pack_id});
});

铁路由器:

Router.route('/package/:id', {
  name: 'package.show',
  template: 'Package_page',
  layoutTemplate: 'Landing_layout',
  waitOn: function() {
    return Meteor.subscribe('SinglePackage', this.params.id);
  },
  data: function() {
    return SinglePackage.find();
  },
  action: function () {
    if (this.ready()) {
      this.render();
    } else {
      this.render('Loading');
    }
  }
});

我是不是做错了什么,或者这只是一件很难实现的事情?有人会认为 waitOn 会使函数的其余部分等待订阅准备就绪。

非常感谢任何帮助。

看来 data 函数在订阅准备就绪之前 运行ning。即使 data 函数在订阅准备就绪后执行了 运行,它也不会是一个反应性数据源,使 pub/sub 在这里毫无意义。 Here's a great article on reactive data sources.

参考 Iron Router Docs 中的订阅示例,您可以这样做:

Router.route('/package/:id', {
  subscriptions: function() {
    // returning a subscription handle or an array of subscription handles
    // adds them to the wait list.
    return Meteor.subscribe('SinglePackage', this.params.id);
  },

  action: function () {
    if (this.ready()) {
      this.render();
    } else {
      this.render('Loading');
    }
  }
});

然后在你的 template.js:

Template.Package_page.helpers({
  singlePackage() {
  // This is now a reactive data source and will automatically update whenever SinglePackage changes in Mongo.
    return Package.find().fetch();
  }
}); 

在您的 template.html 中,您现在可以使用 singlePackage:

<template name="Package_page">
  {#with singlePackage} <!-- Use #each if you're singlePackage is an array -->
    ID: {_id}
  {/with}
</template>