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/
答案 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>