使用模板加载作为服务器方法Meteor js的触发器

时间:2014-06-03 23:28:11

标签: javascript meteor iron-router

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

我的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价值,或者我的方法是完全错误的。如何在渲染时修复视图中偶尔缺少的数据?

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