【发布时间】:2016-01-08 06:26:27
【问题描述】:
我们的布局需要控制器中定义的当前数据,如下所示:
TripController = RouteController.extend({
layoutTemplate: 'tripLayout',
data: function () {
return Trips.findOne({_id: this.params._id});
}
});
我们的问题看起来像是一场数据竞赛:
大多数时候Template.currentData() 为空,但有时(主要是在调试时)它是我们定义的data。
只有当我们在tripLayout中重新加载页面时才会出现问题,而不是当我们从另一个页面进入trip layout时。
请注意,我们已经加载了 `TripController,因为控制器参数设置正确。
Template.tripLayout.onRendered(function() { // note, this is the layout template
Iron.controller.params._id // correct id
Template.currentData() // null
});
我们试图实现的是一个拆分布局,其中右侧始终相同,左侧由 yield 填充(见截图)
更新 (此更新是错误的)
我想我发现了错误:
waitOn: function () {
return [Meteor.subscribe('public-trips'),
Meteor.subscribe('my-trips')];
}
一旦我删除了数组(所以只有一个订阅),
data: function () {
return Trips.find({}).fetch();
}
不再返回 0。我会再研究一下。
更新2
所以我最初的假设是错误的,只订阅一个并没有帮助。这实际上只是一个竞争条件。
UPDATE3
我设法重现了它:meteorpad
在警报中,它显示了它拥有的玩家数量。第一次是 0,然后是 6。但是 0 不应该出现,因为我们 'waitOn' 它?!
【问题讨论】:
-
您的路由中是否定义了
waitOn以等待加载Trips订阅? -
是的,我们这样做:
waitOn: function () { return [Meteor.subscribe('trips')]} -
我猜你也有一个
loading模板? -
您是否尝试过使用 this.data 而不是 Template.currentData()。我通常毫无问题地使用前者。我知道他们都应该返回相同的东西..但也许 currenData() 以更迂回的方式做到这一点?
-
试试
this.data,onRendered回调中的this就是TemplateInstance
标签: javascript meteor iron-router meteor-blaze