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

Ember.js 如何从模板将属性传递给Ember.View,ember.js,Ember.js,我已定义了以下余烬视图: App.ControlGroup = Ember.View.extend classNames: ['control-group'] layoutName: 'controlGroup' 其布局模板controlGroup.handlebar如下所示: <label class="control-label">{{ view.label }}</label> <div class="controls"> {{ yield

我已定义了以下余烬视图:

App.ControlGroup = Ember.View.extend
  classNames: ['control-group']
  layoutName: 'controlGroup'
其布局模板controlGroup.handlebar如下所示:

<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代码片段本身的视图,因此我的实现对我来说似乎是合法的,但我很想看看其他方法。

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

模型:持久数据,将在页面刷新后仍然有效。 控制器:不可持久的数据,在页面刷新后将无法生存,但与视图重新呈现无关。 视图:不时被销毁,例如在{{if}}帮助程序中。 我认为这三个组件的行为意味着将任何给定属性放置在何处。 另外,我认为你的例子组织得很好,如果我错了,我想听听你的理由:


编辑:在label属性的情况下,它基本上就是如何在核心类(如Ember.TextField)中实现value属性。在使用{{view}助手时,可以只给它一个值:{{{view Ember.TextField value=foo}},还可以通过声明它为绑定将其转发给控制器:{{{view Ember.TextField valueBinding=foo}。后者将在控制器上使用名为foo的属性。

这是分离关注点的好方法。关于在模板中使用视图属性的问题,我看不出它是如何被滥用的,或者什么被认为是滥用。正如您所说,它也用于内置的Ember视图中,例如在Ember中。选择包含{view.prompt}的模板。这种过度使用之一是在视图上声明一个全名计算属性,该属性包含模型的firstName和lastName属性。它肯定应该在控制器上声明。这非常适合关注点的分离:它是与模型相关的属性,但不应该持久化。是的,从技术上讲,可以在视图上定义全名,但它实际上不属于视图。我认为保持视图不受模型相关内容影响的重点还来自于这样一个事实:在过去的好日子里,视图曾经是属性查找和操作的默认目标。这完全有道理。有趣的是,您提到应该在控制器上声明全名,因为这是最重要的。重要的是,我现在非常确定我在模板中正确使用了视图属性,并且没有引入反模式。非常感谢。