数组中特定于模板的订阅

时间:2015-08-07 05:05:23

标签: meteor

Template.recent.created = function () {
  this.autorun(function () {
    this.subscriptions = [
      this.subscribe('users'),
      this.subscribe('posts'),
      this.subscribe('comments')
    ];
  }.bind(this));
};

Template.recent.rendered = function () {
  this.autorun(function () {
    var allReady = _.every(this.subscriptions, function (subscription) {
      return subscription.ready();
    });
    ...

这是订阅模板中多个数据库源的正确方法吗?当我在仍然加载时再次渲染此模板时,它似乎进入无限加载状态。

相关文档:https://www.discovermeteor.com/blog/template-level-subscriptions/

1 个答案:

答案 0 :(得分:1)

无需将您的订阅包装在Tracker.autorun中。实际上,每个sub都有一个onReady回调,您可以使用:

this.subscribe('subName', {onReady: function() {
  //Do something when ready
}});

但除此之外,还有一个subscriptionsReady()函数会在您的所有模板子代准备就绪后返回true:{/ 3}}:

所以你的代码变成了:

Template.recent.onCreated(function () {
  this.subscriptions = [
    this.subscribe('users'),
    this.subscribe('posts'),
    this.subscribe('comments')
  ];

  if(this.subscriptionsReady()) {
    //do something when all subs are ready
  }
});

在模板中,您还可以检查所有模板的潜艇是否准备就绪:

<template name="templateName">
  {{#if Template.subscriptionsReady}}
    Everything is ready!
  {{else}}
    Loading...
  {{/if}}
</template>