2012-09-13 86 views
3

有沒有辦法在EmberJS上迭代視圖的上下文屬性?我正在使用Ember-Data(https://github.com/emberjs/data)進行ORM。在EmberJS把手模板中迭代模型的屬性

假設我使用connectOutlets向具有電子郵件,名稱等屬性的用戶註冊UserView。在連接的Handlebars模板中,是否有我可以迭代這些屬性的方法?

基本上,我需要建立一個可以與不同的模型重複使用一個通用的觀點...

回答

4

瑞恩對這些屬性是正確的,但它需要做一些事情才能真正獲得你要去的地方。我的例子是使用最新的RC1 Ember。

下面是編輯模板,它是模型無關:

<script type="text/x-handlebars" data-template-name="edit_monster"> 
    {{#if clientId}} 
    <h1>Edit Monster: {{name}}</h1> 
    <div> 
     {{#each metadata}} 
      <span class="edit-label">{{name}}</span> 
      <span class="edit-field"> 
       {{view App.AutoTextField typeBinding="type" nameBinding="name" }} 
      </span> 
     {{/each}} 
    </div> 
    {{else}} 
    No monster selected. 
    {{/if}} 
</script> 

爲了使這項工作,我們需要一對夫婦的神奇魔法件。該控制器是一個良好的開端:

App.EditMonsterController = Em.ObjectController.extend({ 
    metadata: function() { 
     var vals = []; 
     var attributeMap = this.get('content.constructor.attributes'); 
     attributeMap.forEach(function(name, value) { 
      vals.push(value); 
     }); 
     return vals; 
    }.property('content') 

}); 

,它使用「屬性」,瑞安提到的提供,我們在模板送入我們的#each那裏的元數據屬性!

現在,我們可以使用這個視圖來提供文本輸入。有一個外部容器視圖需要將valueBinding提供給實際的文本框。

App.AutoTextField = Ember.ContainerView.extend({ 
    type: null, 
    name: null, 

    init: function() { 
     this._super(); 
     this.createChildView(); 
    }, 
    createChildView: function() { 
     this.set('currentView', Ember.TextField.create({ 
        valueBinding: 'controller.' + this.get('name'), 
        type: this.get('type') 
       })); 
    }.observes('name', 'type') 
}); 

下面是一個小提琴展示整個瘋狂的事:http://jsfiddle.net/Malkyne/m4bu6/

+0

感謝這@Tess –

+0

該小提琴的Ember數據鏈接現在是404 ...繼承人更新之一:http://jsfiddle.net/ianpetzer/QTdb8/ – ianpetzer

+0

鏈接再次關閉,我重新創建它現在在Codepen這裏:http://codepen.io/kensnyder/pen/doeEu。沒有錯誤,但它不起作用。我很樂意看到這一點,因爲我需要在我正在開展的一個項目上做到這一點。 – ken

2

代表你的模型餘燼數據對象有一個包含所有給定模型的屬性的attributes財產。這是Ember Data的toJSON用來將你的模型轉換成Javascript對象的東西。

您可以使用此屬性屬性來讀取模型屬性,然後將這些特定屬性從實例中拉出。這是一個例子。

http://jsfiddle.net/BdUyU/1/

只是爲了重申一下是怎麼回事。我們正在從App.User中讀取屬性,然後將值從App.ryan和App.steve中提取出來。希望這是有道理的。

+0

否則像這樣的價值觀仍然約束?如果這些屬性在其他地方發生變化,那麼這些變化會立即反映在這個視圖中......或者如果我在這個視圖中使用表單輸入,那麼表單元素將被綁定到屬性的值,反之亦然? –