我可能对我的问题使用了完全不正确的方法,如果可以,请告诉我
My 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
因此,我在想我的模板事件[rendered]是错误的[我在文档中找不到任何地方的模板事件列表],或者我需要做一些事情来等待有效的
this
值,或者我的方法是完全错误的。呈现时,如何解决视图中偶尔出现的数据不足? 最佳答案
在Iron Router路由中使用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
解决。