辅助变量未定义来自路由器数据

时间:2015-03-19 04:08:22

标签: meteor iron-router

我正在根据Session变量检索Collection文档,然后通过iron:router数据上下文将其作为名为store的变量传递。问题是它有时返回undefined,好像它没有及时准备好帮助程序执行。如何确保在帮助程序/模板运行之前始终定义变量?

在我的路线中,您可以看到数据上下文包括根据存储在_id变量中的Session从集合中检索文档:

Router.route('/sales/pos', {
    name: 'sales.pos',
    template: 'pos',
    layoutTemplate:'defaultLayout',
    loadingTemplate: 'loading',
    waitOn: function() {
        return [
            Meteor.subscribe('products'),
            Meteor.subscribe('stores'),
            Meteor.subscribe('locations'),
            Meteor.subscribe('inventory')
        ];
    },
    data: function() {
        data = {
            currentTemplate: 'pos',
            store: Stores.findOne(Session.get('current-store-id'))
        }
        return data;
    }
});

这里的帮助器依赖于传递给模板的store变量:

Template.posProducts.helpers({
    'products': function() {
        var self = this;
        var storeLocationId = self.data.store.locationId;

        ... removed for brevity ...
        return products;
    }
});

1 个答案:

答案 0 :(得分:2)

这是Meteor中的常见问题。当您等待订阅准备就绪时,这并不意味着您的查找功能有时间返回某些内容。你可以通过一些防御性编码解决它:

Template.posProducts.helpers({
  'products': function() {
    var self = this;
    var storeLocationId = self.data.store && self.data.store.locationId;
    if (storeLocationId) {
      ... removed for brevity ...
      return products;
    }
  }
});