2012-09-13 34 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

否则像这样的价值观仍然约束?如果这些属性在其他地方发生变化,那么这些变化会立即反映在这个视图中......或者如果我在这个视图中使用表单输入,那么表单元素将被绑定到属性的值,反之亦然? –