【问题标题】:Ember Route with renderTemplate and two render calls overrides original model带有 renderTemplate 和两个渲染调用的 Ember Route 覆盖原始模型
【发布时间】:2016-01-03 04:33:03
【问题描述】:

我在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}}

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

original_model = {
   field_1: 1,
   field_2: 2
}

然后使用 model.field_1 在模板上下文中变得未定义,而 model.title 可用。

为什么要覆盖模型?


我使用的是 Ember 2.2.0

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    看来这是正确的行为。根据Route API,这是发送给render方法的控制器和模型选项的解释:

    控制器 [字符串|对象]

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

    模型 [对象]

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      • 2013-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多