0

我已经定义了以下 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 片段)本身有关,因此我的实现对我来说似乎是合法的,但我很想看到其他方法。

4

1 回答 1

1

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

  • 模型:可持久的数据,将在页面刷新后继续存在。
  • 控制器非持久化数据,不会在页面刷新后存活,但对视图重新渲染无动于衷。
  • 视图不时被破坏,例如。在一个{{#if}}助手里面。

我认为这三个组件的行为暗示了将任何给定属性放在哪里。
(另外,我认为你的例子组织得很好,如果我错了,我很想听听推理):)

编辑:在label属性的情况下,例如,value属性是如何在核心类中实现的,例如Ember.TextField. {{view}}可以在使用helper:时只给它一个值{{view Ember.TextField value="foo"}},也可以通过声明一个 binding: 来将它转发给控制器{{view Ember.TextField valueBinding="foo"}}。后者将使用foo控制器上命名的属性。

于 2013-03-28T09:54:34.653 回答