如何从模板将属性传递给Ember.View

时间:2013-03-28 08:26:08

标签: ember.js

我定义了以下Ember.View:

App.ControlGroup = Ember.View.extend
  classNames: ['control-group']
  layoutName: 'controlGroup'

布局模板(controlGroup.handlebars)如下所示:

<label class="control-label">{{ view.label }}</label>
<div class="controls">
  {{ yield }}
</div>

以下是使用上面定义的视图的示例:

  {{#view App.ControlGroup label="Property code"}}
    {{#if isNew}}
      {{view Em.TextField valueBinding="code"}}
    {{else}}
      <p>{{code}}</p>
    {{/if}}
  {{/view}}

这将生成以下html:

<div id="ember10170" class="ember-view control-group">
  <label class="control-label">Property code</label>
  <div class="controls">   
    <input id="ember10172" class="ember-view ember-text-field" type="text">
  </div>
</div>

这正是我想要的。但是,我了解到在模板中使用视图的属性(参见上面的{{ view.label }},在controlGroup.handlebars中}})是一种反模式,属性查找应该来自视图的控制器。所以我想知道如何去做。在这种情况下,该属性属于视图(html片段)本身,所以我的实现似乎是合法的,但我很想看到其他方法。

1 个答案:

答案 0 :(得分:1)

我不认为使用视图属性本身就是一种不好的做法,只是人们倾向于过度使用Ember的这种能力。由于模型,控制器,视图具有不同的生命周期,“什么去哪里”的问题可以分解为:

  • 模型可持久数据,将在页面刷新后继续存在。
  • 控制器非持久性数据,无法在页面刷新后继续存在,但对查看重新渲染无动于衷。
  • 观看次数会不时被销毁,例如。在{{#if}}帮助者中。

我认为这三个组成部分的行为意味着放置任何特定财产的位置 (另外,我认为你的例子非常有条理,如果我错了,我很想听听推理):))

编辑:在label属性的情况下,几乎就是value属性在Ember.TextField等核心类中实现的方式。使用{{view}}帮助器时可以给它一个值:{{view Ember.TextField value="foo"}}),也可以通过声明绑定来将它转发给控制器:{{view Ember.TextField valueBinding="foo"}}。后者将在控制器上使用名为foo的属性。