模板处理程序中的流星异常
Meteor exception in template handler
这个问题类似于 发现的那个问题,具体来说,我的 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
});
现在,流路由器配置:
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
,这很令人沮丧。
最终,解决方案变成了here。具体来说:
- 将订阅放在模板 .js 文件的
autorun
块中。
- 在模板助手中获取 FlowRouter 参数。
- 用
{{#with currentProject}}
(或其他)标签包装 UI 代码。
这个问题类似于
[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
});
现在,流路由器配置:
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
,这很令人沮丧。
最终,解决方案变成了here。具体来说:
- 将订阅放在模板 .js 文件的
autorun
块中。 - 在模板助手中获取 FlowRouter 参数。
- 用
{{#with currentProject}}
(或其他)标签包装 UI 代码。