iron:router 控制器中的 Meteor 订阅不工作

Meteor subscription in iron:router controller isn't working

我在我的应用程序中使用 iron:router,并且我有一个控制器通过使用路径中的参数订阅 collection 中的一个文档。我可以访问服务器上 collection 中的所有文档,所以我知道那里有东西,但是当我尝试访问我在控制器的 waitOn 方法中订阅的数据时,数据未定义。这是这个问题的相关代码。

路由器代码:

this.route('unit', { path: 'unit/:unitId', template: 'unit', controller: 'UnitController' });

UnitController = BaseController.extend({
  waitOn: function () {
    return Meteor.subscribe('getUnit', this.params.unitId);
  },
  data: function () {
    var id = this.params.unitId;
    
    templateData = {
      unit: Collections.units.model(Collections.units.getUnit(id))
    };
    return templateData;
  }
});

出版物:

Meteor.publish('getUnit', function(id) {
  return Collections.units.data.find({ unitId: id });
});

我在这里创建了一个 object 用于与我的 collection 相关的各种事情(我只在此处包含重要部分):

Collections.units = {
 data: new Mongo.Collection("units"),
 getUnit: function (id) {
  return this.data.findOne({ unitId: id });
 },
 model: function(unitEntity) {
       return {
         unitId: unitEntity.unitId,
         createdAt: unitId.createdAt,
         packets: unitEntity.packets,
         getLastPacket: function (id) {
         return _.last(this.packets);
         }
       };
    }
};

我已经尝试调试它很长一段时间了,我可以对 collection 我想在服务器和发布方法中做的所有事情,但是当它到达控制器时,我无法访问任何信息。在数据方法 this.params.unitId returns 中正是我想要的,所以这不是问题。抛出异常的地方是当我在制作模型时尝试读取 unitEntity 的属性,但这只是因为它未定义。

知道我做错了什么吗?预先感谢您的任何回复。

我试图解决的主要问题是将代码包装在 if (this.ready()){ ... } 内的数据方法中,并使用 if (this.data()) { this.render(); } 添加一个动作挂钩。在我开始订阅后,我发现 Christian 在评论中说我的控制器设置可能会搞砸是对的。它导致了其他奇怪的异常,我通过将挂钩移动到每个路由而不是使用控制器来修复这些异常。至于我的 Collections 设置,它可能是非常规的,但所有这些都运行良好(截至目前)。稍后我可能想以标准方式设置它们,但就目前而言,使用对象中已编写的方法处理集合对我来说非常方便。