我在我的应用程序中使用iron:router并且我有一个控制器,通过使用路径中的参数来订阅集合中的一个文档。我可以在服务器上访问我的集合中的所有文档,所以我知道那里有东西,但是当我尝试访问我在控制器的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 });
});

在这里,我创建了一个对象,用于处理与我的集合有关的各种事情(我只在这里包含了重要的部分):
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);
}
};
}
};

我一直在尝试调试这个问题很长一段时间我可以在服务器和发布方法中对我想要的集合做所有的事情,但当它到达控制器时,我不能访问任何信息。在数据方法中,this.params.unitId正好返回我想要的东西,因此不是问题所在。抛出异常的地方是我在制作模型时尝试读取unitEntity的属性,但这只是因为它未定义。
有任何想法我做错了吗?提前感谢任何回复。
答案 0 :(得分:0)
我试图解决的主要问题是将代码包装在if (this.ready()){ ... }
内的数据方法中,并添加一个带if (this.data()) { this.render(); }
的动作挂钩。在我订阅工作之后,我发现Christian在评论中是正确的,并说我的控制器设置可能会搞砸了。它导致了其他奇怪的异常,我通过将钩子移动到每个路径而不是使用控制器来修复。至于我的Collections
设置,它可能是非常规的,但所有这些都很好(截至目前)。我可能希望稍后将它们设置为标准方式,但是现在对于我来说,使用已经在对象中编写的方法对集合进行处理非常方便。