我有一个应该显示一些数据的 meteor 模板。
Template.svg_template.rendered = function () {
dataset_collection = Pushups.find({},{fields: { date:1, data:1 }}, {sort: {date: -1}}).fetch();
a = moment(dataset_collection[0].date, "YYYY/M/D");
//more code follows that is also dependent on the collection being completely loaded
};
有时它有效,有时我收到此错误:
Deps afterFlush 函数的异常:TypeError:无法读取未定义的属性“日期”
我没有在任何情况下使用 Deps。据我了解,该集合在完全加载完成之前被引用。
因此,我想弄清楚如何简单地说“等到找到集合再继续”。应该很简单,但找不到更新的解决方案。
最佳答案
您是对的,您应该确保在正确加载数据后执行取决于获取客户端订阅集合的内容的代码。
您可以使用 Meteor 1.0.4 中引入的新模式来实现这一点:https://docs.meteor.com/#/full/Blaze-TemplateInstance-subscribeclient/views/svg/svg.js
Template.outer.onCreated(function(){
// subscribe to the publication responsible for sending the Pushups
// documents down to the client
this.subscribe("pushupsPub");
});
client/views/svg/svg.html
<template name="outer">
{{#if Template.subscriptionsReady}}
{{> svgTemplate}}
{{else}}
Loading...
{{/if}}
</template>
在 Spacebars 模板声明中,我们使用一个封装
outer
的模板来处理模板级订阅模式。我们在
onCreated
生命周期事件中订阅发布,并且我们使用特殊的响应式(Reactive)助手 Template.subscriptionsReady
仅在订阅准备好(数据在浏览器中可用)后才呈现 svgTemplate
。此时,我们可以安全地查询
Pushups
svgTemplate
生命周期事件中的 onRendered
集合,因为我们确保数据已到达客户端: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(){
// waitOn makes sure that this publication is ready before rendering your template
return Meteor.subscribe("publication");
},
data: function(){
// this will be used as the current data context in your template
return Pushups.find(/*...*/);
}
});
使用这段简单的代码,您将获得您想要的以及许多附加功能。
您可以查看 Iron Router 指南,其中详细介绍了这些功能。
https://github.com/iron-meteor/iron-router/blob/devel/Guide.md
编辑 18/3/2015:重新设计答案,因为它包含过时的 Material ,但仍然收到了赞成票。
关于javascript - 等待 meteor 采集完成后再进行下一步,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20942025/