带有renderTemplate和两个渲染调用的Ember Route会覆盖原始模型

时间:2016-01-03 04:33:03

标签: ember.js

我在application.hbs有一个名为' sidebar'的插座。此插座用于某些路线,使用名为' sidebar-info'的组件呈现其他信息。在这些路线中,我使用renderTemplate在适当的出口处渲染东西。例如:

renderTemplate: function(controller, model) {
    this.render('components/sidebar-info', {
        into: 'application',
        outlet: 'sidebar',
        model: Ember.Object.create({
            title: this.get('i18n').t('signup'),
            detailsComponent: 'signup-help'
        })
    });
    this.render('sign-up');
},

这是components/sidebar-info模板:

<div class="title">
    <h1>{{model.title}}</h1>
</div>
{{#if model.detailsComponent}}
<div class="details">
    {{component model.detailsComponent}}
</div>
{{/if}}

当渲染路径模板(而不是组件1)时,路由定义的模型将被发送到组件的模型覆盖。如果原始模型是这样的:

original_model = {
   field_1: 1,
   field_2: 2
}

然后在model.field_1可用的情况下,在模板的上下文中使用model.title未定义。

为什么要覆盖模型?

我使用的是Ember 2.2.0

1 个答案:

答案 0 :(得分:1)

这似乎是正确的行为。根据{{​​3}},这是发送到render方法的控制器和模型选项的解释:

  

控制器 [String | Object]

     

用于此模板的控制器,由名称引用或作为   控制器实例。默认为Route的配对控制器

     

模型 [对象]

     

要在options.controller上设置的模型对象。默认为   Route的模型钩子的返回值

这意味着设置模型选项会在路由的配对控制器上设置模型,因为是默认 option.controller。这意味着我们需要创建一个仅用于接收模型的虚拟控制器。

我已对此进行了测试,并且按预期工作。