使用Iron-Router 1.0.3和Meteor 1.0。
我定义了这条路线:
Router.route('audit', {
path: '/audit/:audit_id/',
template: 'audit',
data: function() {
audit = Audits.findOne({_id: this.params.audit_id});
lineitems = LineItems.find(JSON.parse(audit.query));
return {
audit: audit,
lineitems: lineitems
}
},
waitOn: function () {
return [
Meteor.subscribe('audits'),
Meteor.subscribe('lineitems', this.params.audit_id),
]
}
});
Audits集合中的对象具有以下结构:
{
_id: 'timestamped-id-that-I-generate',
name: 'some name',
query: JSON.stringify({'$and': [list of query conditions here]})
}
当我走到这条路线时,我的控制台出现以下错误:
Uncaught TypeError: Cannot read property 'query' of undefined
但是,如果我转到我的浏览器控制台,我可以检查Audits集合,并且我看到具有相应_id和查询的Audit对象按预期存在。
顺便提一下,服务器端的lineitems的发布方法只会查找同一个审计对象并发布与其匹配的查询对象。
(我必须通过JSON来回查询查询,否则查询对象将包含违反MongoDB规则的字段名称。)
答案 0 :(得分:2)
在撰写本文时,Iron Router的data
挂钩可能会在评估路由时多次运行。您可以假设它将在订阅准备好之前运行一次,之后再次运行。由于它会在您的订阅准备就绪之前运行,因此您需要假设Audits.findOne
将至少返回undefined
一次。你有两个选择:
this.ready()
挂钩中的data
:data: function() {
if (this.ready()) {
audit = Audits.findOne({_id: this.params.audit_id});
lineitems = LineItems.find(JSON.parse(audit.query));
return {audit: audit, lineitems: lineitems};
}
}
data: function() {
audit = Audits.findOne({_id: this.params.audit_id});
if (audit && audit.query) {
lineitems = LineItems.find(JSON.parse(audit.query));
return {audit: audit, lineitems: lineitems};
}
}
如果出现以下情况,两者的组合实际上可能是合适的:(a)您没有进行任何审核,或(b)并非所有审核都有查询。