我可能对我的问题使用了完全不正确的方法,如果可以,请告诉我

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解决。

10-07 19:36
查看更多