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'});
    } 
}