我可能对我的问题使用了一种完全不正确的方法,如果有,请告诉我
我的Meteor应用收集电子邮件地址,并通过电子邮件向他们发送带有令牌的下载页面的链接。此下载页面是Iron Router路由,令牌是集合中项目的ID。检查令牌以用于先前使用,然后将启动下载[该部分尚未写入]。所以我有这条路线:
this.route('download', {
path: '/download/:_id',
template: 'capture_download',
waitOn: function () {
return Meteor.subscribe('captures');
},
data: function() { return Captures.findOne(this.params._id); }
});
因此,我需要触发对我的服务器方法的调用,该方法在加载此路由后立即执行检查逻辑。我需要ID值才能进行该调用。所以我有这个:
Template.capture_download.rendered = function(template) {
Meteor.call('claimDownload', this.data._id, function(err, result) {
// callback logic here
});
}
我不明白的是,这有时只会起作用。有时调用会在ID值正确的情况下发生。其他时间我得到:
Exception from Deps afterFlush function function: TypeError: Cannot read property '_id' of null
所以我认为我的模板事件[呈现]是错误的[我无法在文档中找到任何地方的模板事件列表],或者我需要做一些事情来等待有效的{{1价值,或者我的方法是完全错误的。如何在渲染时修复视图中偶尔缺少的数据?
答案 0 :(得分:2)
在铁路由器路由中使用onBeforeAction
,而不是模板中的rendered
方法:
this.route('download', {
path: '/download/:_id',
template: 'capture_download',
waitOn: function () {
return Meteor.subscribe('captures');
},
data: function() { return Captures.findOne(this.params._id); },
onBeforeAction: function() {
Meteor.call('claimDownload', this.params._id, function(err, result) {
// callback logic here
});
}
});
见https://github.com/EventedMind/iron-router/blob/dev/DOCS.md#before-and-after-hooks。您的“检查令牌先前使用”听起来很像“检查用户已登录”文档中的示例,该示例使用onBeforeAction
解决。