流星铁路由器WaitOn订阅

时间:2017-07-06 13:28:48

标签: javascript meteor iron-router

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

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

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

Collections.js lib:

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会让剩下的函数等到订阅准备就绪。

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

在订阅准备好之前,data函数似乎正在运行。即使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>