IronRouter以布局

时间:2015-10-10 10:26:47

标签: javascript meteor iron-router meteor-blaze

我们的布局需要在控制器中定义的当前数据,如下所示:

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

我们要实现的是分割布局,其中右侧始终相同,左侧由屈服填充(参见屏幕截图)layout

更新 (此更新错误)

我想我发现了错误:

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'它?!

1 个答案:

答案 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定义了将添加到等待列表中,但不是那个   等待名单将等待。从本质上讲,现在发生的是你的   由于反应性,动作函数被调用两次   模板仅在数据准备好后才会呈现。