您说得对,应确保在客户端订阅集合的内容加载完毕后再执行依赖于该内容的代码。
您可以使用 Meteor 1.0.4 中引入的新模式来实现:https://docs.meteor.com/#/full/Blaze-TemplateInstance-subscribe
client/views/svg/svg.js
Template.outer.onCreated(function(){
this.subscribe("pushupsPub");
});
client/views/svg/svg.html
<template name="outer">
{{#if Template.subscriptionsReady}}
{{> svgTemplate}}
{{else}}
Loading...
{{/if}}
</template>
在Spacebars模板声明中,我们使用包含outer
模板来处理模板级别的订阅模式。
我们在onCreated
生命周期事件中订阅发布,然后使用特殊的响应式辅助函数Template.subscriptionsReady
,只有在订阅准备就绪(数据在浏览器可用)时才渲染svgTemplate
。
此时,在svgTemplate
的onRendered
生命周期事件中可以安全地查询Pushups
集合,因为我们确保了数据传输到客户端:
Template.svgTemplate.onRendered(function(){
console.log(Pushups.find().fetch());
});
或者,你可以使用 iron:router
(https://github.com/iron-meteor/iron-router)。它提供了另一种设计模式来解决这个常见的与Meteor相关的问题,即将订阅处理移至路由级别而不是模板级别。
将该包添加到您的项目中:
meteor add iron:router
lib/router.js
Router.route("/svg", {
name: "svg",
template: "svgTemplate",
waitOn: function(){
return Meteor.subscribe("publication");
},
data: function(){
return Pushups.find();
}
});
使用这段简单的代码,你将得到你想要的内容以及许多附加功能。你可以查看Iron Router指南,该指南详细解释了这些功能。
https://github.com/iron-meteor/iron-router/blob/devel/Guide.md
编辑于18/3/2015: 重新修订了答案,因为它包含过时的材料,但仍然受到赞同。