我们的布局需要在控制器中定义的当前数据,如下所示:
TripController = RouteController.extend({
layoutTemplate: 'tripLayout',
data: function () {
return Trips.findOne({_id: this.params._id});
}
});
我们的问题似乎是数据竞争:
大多数时候Template.currentData()
为空,但有时(主要是在调试时),我们定义的是data
。
问题只发生在我们在tripLayout中重新加载页面时,而不是在我们从另一个页面输入旅行布局时。
请注意,我们认为`TripController已加载,因为控制器参数已正确设置。
Template.tripLayout.onRendered(function() { // note, this is the layout template
Iron.controller.params._id // correct id
Template.currentData() // null
});
我们要实现的是分割布局,其中右侧始终相同,左侧由屈服填充(参见屏幕截图)
更新 (此更新错误)
我想我发现了错误:
waitOn: function () {
return [Meteor.subscribe('public-trips'),
Meteor.subscribe('my-trips')];
}
一旦我删除了数组(所以只有一个订阅),
data: function () {
return Trips.find({}).fetch();
}
不再返回0。我会再研究一下。
UPDATE2
所以我最初的假设是错误的,订阅只有一个没有帮助。这真的只是一场竞争。
UPDATE3
我设法重现它:meteorpad
在警报中,它会显示其拥有的玩家数量。第一次它是0然后是6.但是0不应该出现,因为我们'waitOn'它?!
答案 0 :(得分:1)
我们设法解决了'问题'(这是预期的行为,但我们找到了解决方法)!详情请见https://github.com/iron-meteor/iron-router/issues/1464#issuecomment-158738943:
好的,这是我们解决这个问题的方法:
第一个重要的是要包含动作功能 这样:
action: function() { if (this.ready()) { this.render(); } }
这几乎适用于所有事情,但我们仍有一些问题。在 我们的情况,它是关于使用yield不呈现的模板, 因此不受Iron Router的控制。切换到 内容区域(使用{{yield'contentRegionName'}})然后 在动作函数中显式地呈现它们如下:
action: function() { if (this.ready()) { this.render(); this.render('contentRegionTemplate', {to: 'contentRegionName'}); } }
你需要这些动作功能,因为waitOn只意味着 sub定义了将添加到等待列表中,但不是那个 等待名单将等待。从本质上讲,现在发生的是你的 由于反应性,动作函数被调用两次 模板仅在数据准备好后才会呈现。