2013-03-28 45 views
0

我已經定義了以下Ember.View模板傳遞到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

我不認爲使用視圖屬性本身就是一個壞習慣,只是人們傾向於過度使用Ember的這種能力。作爲模型,控制器,觀點有不同的生命週期,「做什麼去哪裏」的問題可以分解爲如下:

  • 模式可持久數據,將生存頁面刷新。
  • 控制器非持久數據,將無法存活頁面刷新,但無視視圖重新呈現。
  • 觀看次數不時被破壞,例如。在{{#if}}助手內。

我認爲這3個組件的行爲意味着在哪裏放置任何給定的屬性。
(另外,我覺得你的例子是完全有組織的,我很樂意聽到的理由,如果我錯了):)

編輯:在label財產的情況下,這幾乎是如何,例如,value屬性在類似Ember.TextField的核心類中實現。使用{{view}}幫助程序時可以給它一個值:{{view Ember.TextField value="foo"}}),也可以通過聲明它爲綁定:{{view Ember.TextField valueBinding="foo"}}來將其轉發給控制器。後者將使用控制器上名爲foo的屬性。

+0

很好的方式來看待關注的分離。關於在模板中使用視圖屬性的問題,我沒有看到它如何被濫用或被認爲是濫用。如您所說,它也用於內置的Ember視圖,例如Ember.Select模板包含{{view.prompt}}。 – 2013-03-28 10:49:07

+0

其中一種過度使用是在視圖上聲明一個'fullName'計算屬性,該屬性連接模型的'firstName'和'lastName'屬性。它肯定應該在控制器上聲明。這很好地符合問題的分離:它是與模型相關的屬性,但不應該被持久化。是的,在視圖上定義'fullName'在技術上是可行的,但它確實不屬於此處。我認爲強調保持視圖不含模型相關的東西也是因爲視圖曾經是財產查詢和行爲的默認目標。 – zeppelin 2013-03-28 11:13:01

+0

這使得總體感覺。有趣的是,你提到fullName應該在控制器上聲明,因爲這是[指南中給出的計算模型屬性的典型示例](http://emberjs.com/guides/object-model/computed-properties/)。重要的是,我現在很確定我在模板中正確使用了view屬性,並沒有引入反模式。謝謝。 – 2013-03-28 14:17:47

相關問題