流星铁路由器:为什么这个路由设置(使用waitOn和数据功能)不能正常工作?

时间:2014-11-24 16:36:36

标签: meteor iron-router

使用Iron-Router 1.0.3和Meteor 1.0。

我定义了这条路线:

Router.route('audit', {
    path: '/audit/:audit_id/',
    template: 'audit',
    data: function() {
        audit = Audits.findOne({_id: this.params.audit_id});
        lineitems = LineItems.find(JSON.parse(audit.query));
        return {
            audit: audit,
            lineitems: lineitems
        }
    },
    waitOn: function () {
        return [
            Meteor.subscribe('audits'),
            Meteor.subscribe('lineitems', this.params.audit_id),
        ]
    }
});

Audits集合中的对象具有以下结构:

{
    _id: 'timestamped-id-that-I-generate',
    name: 'some name',
    query: JSON.stringify({'$and': [list of query conditions here]})
}

当我走到这条路线时,我的控制台出现以下错误:

Uncaught TypeError: Cannot read property 'query' of undefined

但是,如果我转到我的浏览器控制台,我可以检查Audits集合,并且我看到具有相应_id和查询的Audit对象按预期存在。

顺便提一下,服务器端的lineitems的发布方法只会查找同一个审计对象并发布与其匹配的查询对象。

(我必须通过JSON来回查询查询,否则查询对象将包含违反MongoDB规则的字段名称。)

1 个答案:

答案 0 :(得分:2)

在撰写本文时,Iron Router的data挂钩可能会在评估路由时多次运行。您可以假设它将在订阅准备好之前运行一次,之后再次运行。由于它会在您的订阅准备就绪之前运行,因此您需要假设Audits.findOne将至少返回undefined一次。你有两个选择:

  1. 检查this.ready()挂钩中的data
  2. data: function() {
      if (this.ready()) {
        audit = Audits.findOne({_id: this.params.audit_id});
        lineitems = LineItems.find(JSON.parse(audit.query));
        return {audit: audit, lineitems: lineitems};
      }
    }
    
    1. 使用guard
    2. data: function() {
        audit = Audits.findOne({_id: this.params.audit_id});
        if (audit && audit.query) {
          lineitems = LineItems.find(JSON.parse(audit.query));
          return {audit: audit, lineitems: lineitems};
        }
      }
      

      如果出现以下情况,两者的组合实际上可能是合适的:(a)您没有进行任何审核,或(b)并非所有审核都有查询。