在我的Meteor应用程序中,我具有此rendered
函数,该函数需要访问特定的集合。假设我有一个待办事项集合
ToDos = new Meteor.Collection('todos');
if (Meteor.isClient) {
Meteor.subscribe('todos');
}
if (Meteor.isServer) {
Meteor.startup(function () {
Meteor.publish('todos', function () {
return ToDos.find({});
});
});
}
现在在渲染函数中,我想做这样的事情
Template.todos.rendered = function () {
var todo = ToDos.findOne({...});
if (todo) {
$('[datepicker]').datepicker('setDate', todo.date);
}
}
我的问题是,当调用
rendered
时,todo
是undefined
,并且此函数仅被调用一次。有解决办法吗? Deps.autorun
可以帮助吗?如果是,怎么办?另一方面,如果我只能听
ToDos
,那么我可以在那里更新日期选择器! 最佳答案
是的,这在Meteor中可能是一个令人讨厌的问题。本质上,虽然Meteor.subscribe
调用返回的句柄具有ready
方法,该方法将告诉您集合是否已准备就绪,通常rendered
回调将在返回true
时运行。在这种情况下不是很有用。在某些情况下,您可以在订阅调用中使用onReady
回调,如果您知道模板实例存在并且可以在rendered
回调中执行任何操作,则甚至可以从其他位置插入模板的数据上下文。可能是一种非常混乱的方式来解决您所遇到的问题(因为在某些情况下,在DOM呈现之前,集合已经准备就绪,它可能会崩溃)。
解:
通常,iron router是最好的解决方案,因为它允许每个路由都有一个waitOn
回调,您可以使用该回调指定在页面开始呈现之前哪些订阅需要为ready()
(尽管您可以等待带有ready
回调的所有内容,而不仅仅是订阅)。这样,您始终知道Collection.find
将返回您在rendered
回调首次运行时所期望的状态。