Javascript IronRouter在布局中获取数据
我们的布局需要控制器中定义的当前数据,如下所示:Javascript IronRouter在布局中获取数据,javascript,meteor,iron-router,meteor-blaze,Javascript,Meteor,Iron Router,Meteor Blaze,我们的布局需要控制器中定义的当前数据,如下所示: TripController = RouteController.extend({ layoutTemplate: 'tripLayout', data: function () { return Trips.findOne({_id: this.params._id}); } }); 我们的问题似乎是一场数据竞赛: 大多数时候Template.currentData()为空,但有时(主要是在调试时)我们
TripController = RouteController.extend({
layoutTemplate: 'tripLayout',
data: function () {
return Trips.findOne({_id: this.params._id});
}
});
我们的问题似乎是一场数据竞赛:
大多数时候Template.currentData()
为空,但有时(主要是在调试时)我们定义的是data
。
只有当我们在tripLayout中重新加载页面时,问题才会出现,而不是当我们从另一个页面进入trip布局时
请注意,由于控制器参数设置正确,我们需要加载“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')];
}
一旦我移除阵列(因此只有一个订阅)
不再返回0。我会再仔细研究一下
更新2
所以我最初的假设是错误的,只订阅一个是没有帮助的。这实际上只是一个比赛条件
更新3
我设法复制了它:
在警报中,它显示了它拥有的玩家数量。第一次是0,然后是6。但是0不应该出现,因为我们正在等待它 我们设法解决了“问题”(这是预期的行为,但我们找到了解决办法)!详情见: 好的,下面是我们如何解决该问题的: 第一件重要的事情是包括动作函数,如 因此: 这几乎适用于所有情况,但我们仍然存在一些问题。在里面 我们的案例是关于在使用yield时没有呈现的模板, 并因此失去了铁路由器的控制。把这些换成 内容区域(使用{yield'contentRegionName'}}),然后 在动作函数中显式呈现它们,如下所示:
action: function() {
if (this.ready()) {
this.render();
this.render('contentRegionTemplate', {to: 'contentRegionName'});
}
}
您需要这些操作函数,因为waitOn只意味着
在那里定义的sub将被添加到等待列表中,但不是那样
等待名单将被等待。本质上,现在发生的是你的
由于反应性,action函数被调用两次
模板仅在数据准备就绪后呈现
您的路由中是否定义了一个等待加载
Trips
订阅的waitOn
呢?是的,我们是这样做的:waitOn:function(){return[Meteor.subscribe('Trips')]}
我想您也有一个加载
模板吗?您是否尝试过使用这个.data而不是template.currentData()。我通常使用前者,没有问题。我知道它们都应该返回相同的内容..但是currenData()可能会以更迂回的方式执行此操作?请尝试this.data
,onRendered回调中的this
将是TemplateInstance
action: function() {
if (this.ready()) {
this.render();
}
}
action: function() {
if (this.ready()) {
this.render();
this.render('contentRegionTemplate', {to: 'contentRegionName'});
}
}