在我的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时,todoundefined,并且此函数仅被调用一次。有解决办法吗? Deps.autorun可以帮助吗?如果是,怎么办?

另一方面,如果我只能听ToDos,那么我可以在那里更新日期选择器!

最佳答案

是的,这在Meteor中可能是一个令人讨厌的问题。本质上,虽然Meteor.subscribe调用返回的句柄具有ready方法,该方法将告诉您集合是否已准备就绪,通常rendered回调将在返回true时运行。在这种情况下不是很有用。在某些情况下,您可以在订阅调用中使用onReady回调,如果您知道模板实例存在并且可以在rendered回调中执行任何操作,则甚至可以从其他位置插入模板的数据上下文。可能是一种非常混乱的方式来解决您所遇到的问题(因为在某些情况下,在DOM呈现之前,集合已经准备就绪,它可能会崩溃)。

解:
通常,iron router是最好的解决方案,因为它允许每个路由都有一个waitOn回调,您可以使用该回调指定在页面开始呈现之前哪些订阅需要为ready()(尽管您可以等待带有ready回调的所有内容,而不仅仅是订阅)。这样,您始终知道Collection.find将返回您在rendered回调首次运行时所期望的状态。

09-11 00:18