Javascript Meteor:在'中加载收集;渲染';功能
在我的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 () {
渲染的
函数,需要访问特定的集合。假设我有一个收集待办事项
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链接有很好的文档,也很有帮助。