这个问题类似于找到here的问题,具体来说,我的Meteor应用程序按照预期的那样做,但是在这些行中将一个丑陋的错误转储到控制台中:
[Log] Exception in template helper: project@http://localhost:3000/app/app.js?hash=9d27a5d54ce7e2e0519a4359c523c992bfdc3894:991:54 (meteor.js, line 930)
...60 lines snipped...
onclick@http://localhost:3000/packages/kadira_flow-router.js?hash=a7cc426e8dadbfad936f4f03bda0e74ded30ae36:1617:14
另一个相关问题的答案表明,这是由于在尚未加载对象时尝试访问该对象引起的。但是,我试图按如下方式防止这种情况。
数据来自服务器main.js
,因此:
Meteor.publish('oneCount', function countPublication(countId) {
let oneCount = Counts.find({_id: countId});
return oneCount
});
现在,Flow Router配置:
FlowRouter.route('/edit_count/:countId', {
subscriptions: function(params) {
this.register('currentCount', Meteor.subscribe('oneCount', params.countId));
},
action: function(params) {
BlazeLayout.render('MainLayout', {content: 'EditCount', countId: params.countId})
}
});
并且,在EditCount模板和相关的javascript中:
{{#if isReady }}
...
<a class="btn" href="/count/{{ project }}">Project</a>
...
{{else}}
{{> Loading}}
{{/if}}
Template.EditCount.helpers({
project: function() {
const project = Projects.findOne({counts: this.countId()});
return project._id;
},
isReady: function(sub) {
if(sub) {
return FlowRouter.subsReady(sub);
} else {
return FlowRouter.subsReady();
}
}
})
我得到的错误并未涉及我的代码的特定部分,主要是blaze和flow-router。
我已经读过在路由器中订阅可能现在被认为是不好的形式,所以我用这个替换了代码:
FlowRouter.route('/edit_count/:countId', {
name: 'edit_count',
action: function(params) {
BlazeLayout.render('MainLayout', {content: 'EditCount', countId: params.countId})
}
});
Template.EditCount.onCreated(function() {
this.subscribe('oneCount', this.countId());
})
...然后,在模板中使用Template.subscriptionsReady
而不是isReady
函数。但是,现在没有任何渲染,我从app.js获得Exception in defer callback
。
如果有人有任何关于哪种最佳模式以及如何解决它的建议,那将非常感激。
编辑:
我从所有路线中删除了订阅,并将它们放入模板中。如果我尝试使用返回单个结果的出版物,那么我会得到上面的Exception in defer callback
错误,但是订阅了所有记录的出版物。然而,尽管现在在模板中订阅我仍然得到Exception in template helper
,这是相当令人沮丧的。
答案 0 :(得分:0)
最终,解决方案原来是here。具体做法是:
autorun
块中。 {{#with currentProject}}
(或其他)标记包装UI代码。