Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Meteor:在'中加载收集;渲染';功能_Javascript_Meteor - Fatal编程技术网

Javascript Meteor:在'中加载收集;渲染';功能

Javascript Meteor:在'中加载收集;渲染';功能,javascript,meteor,Javascript,Meteor,在我的Meteor应用程序中,我有这个渲染的函数,需要访问特定的集合。假设我有一个收集待办事项 ToDos = new Meteor.Collection('todos'); if (Meteor.isClient) { Meteor.subscribe('todos'); } if (Meteor.isServer) { Meteor.startup(function () { Meteor.publish('todos', function () {

在我的Meteor应用程序中,我有这个
渲染的
函数,需要访问特定的集合。假设我有一个收集待办事项

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
help?。如果是,如何进行


另一方面,如果我可以只听
待办事项
,我就可以更新那里的日期选择器

是的,这在Meteor中是一个潜在的恼人问题。本质上,虽然
Meteor.subscribe
调用返回的句柄有一个
ready
方法,它会告诉您集合是否准备好,但通常在返回
true
时,
呈现的
回调已经运行,因此在这种情况下它不是很有用。在某些情况下,您可以在subscribe调用中使用
onReady
回调,如果您知道模板实例存在并在
呈现的
回调中执行任何操作,甚至可以从其他位置插入模板的数据上下文,但这可能是一种非常混乱的处理问题的方法(因为如果有一种情况,集合在呈现DOM之前就准备好了,它就会崩溃)

解决方案:
通常情况下,这是最好的解决方案,因为它允许每条路由都有一个
waitOn
回调,您可以使用该回调指定在页面开始呈现之前哪些订阅需要
ready()
(尽管您可以使用
ready
回调等待任何内容,而不仅仅是订阅)。这样,你就知道你的
集合.find
将在你的
呈现的
回调第一次运行时返回你期望的结果。

假设你有一个只有一个页面的简单应用程序

一个可能的deps实现

if (Meteor.isClient) {
    Meteor.startup(function() {
        Meteor.subscribe('todos');
        Deps.autorun(function(e) {
            var todo = ToDos.findOne({...});
            var $picker = $('[datepicker]');
            if (!!todo && !!$picker) {
                $picker.datepicker('setDate', todo.date);
            }
        });
    });
}
Meteor首先渲染模板,然后获取数据。因此,当数据发生变化时,您必须去设置数据选择器

你可能也感兴趣。您可以在每次添加、更改、删除数据时获得回调

var todo = ToDos.find({...});
var handle = todo.observeChanges({
    added: function (id, todo) {
        // do stuff on added
    },
    removed: function () {
        // do stuff on removed
    }
});

如果我这样做:
var cursor=ToDos.find({});cursor.observe(function(){..})在渲染函数中,不会发生任何事情。请注意,在我的例子中,数据没有改变,需要先加载。看起来您的观察语法不太正确。我根据语法编辑了我的评论。应该是类似于Observeiron的路线听起来不错的解决方案。你知道有什么好地方可以找到关于这个主题的可靠文档吗?我发布的github链接有很好的文档,也很有帮助。