我在这里难过。我无法通过onCreated
方法找到它的集合。如果我在调用之前记录data.source_id
,然后在控制台中执行相同的查找,则会找到它。关于onCreated
或其他什么东西有什么特别之处吗?我只是做错了吗?
的客户机/ setup.js
Meteor.subscribe('source_elements');
Meteor.subscribe('internal_elements');
的客户机/ submit.js
Router.route('/element/submit', function() {
this.render('submit', {
data: {
source_id: this.params.query.source_id,
},
});
});
Template.submit.onCreated(function() {
var data = Template.instance().data;
var source_element = SourceElements.findOne({'_id': data.source_id});
console.log(source_element); // EMPTY!!
});
Template.submit.helpers({
element: function() {
var data = Template.instance().data;
var source_element = SourceElements.findOne({'_id': data.source_id});
console.log(source_element); // RESULT!!
return source_element;
},
});
答案 0 :(得分:1)
订阅是异步的。看起来您在数据到达客户端之前创建了模板。当您在控制台中执行find
时,客户端已收到数据。
在onCreated
函数中,您可以使用Tracker.autorun
指定在SourceElements
集合更改时重新运行的函数(这是所有模板帮助程序在幕后执行的操作):< / p>
Tracker.autorun(function() {
var element = SourceElements.findOne({'_id': data.source_id});
console.log(element);
});
将立即调用此函数。此时,findOne
可能会返回undefined
,因为订阅尚未准备好。数据到达后,将再次调用该函数,您可以处理返回的元素。