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
设置,它可能是非常规的,但所有这些都运行良好(截至目前)。稍后我可能想以标准方式设置它们,但就目前而言,使用对象中已编写的方法处理集合对我来说非常方便。
我在我的应用程序中使用 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
设置,它可能是非常规的,但所有这些都运行良好(截至目前)。稍后我可能想以标准方式设置它们,但就目前而言,使用对象中已编写的方法处理集合对我来说非常方便。