在EmberJS手柄模板中迭代模型的属性

时间:2012-09-13 21:51:39

标签: ember.js handlebars.js ember-data

有没有办法在EmberJS中迭代视图的上下文属性?我正在使用Ember-Data(https://github.com/emberjs/data)进行ORM。

假设我使用connectOutlets向具有电子邮件,名称等属性的用户注册UserView。在连接的Handlebars模板中,无论如何我可以迭代这些属性吗?

我基本上需要构建一个可以在不同模型中重用的通用视图......

2 个答案:

答案 0 :(得分:4)

Ryan对这些属性是对的,但实际到达目的地需要做些什么。我的例子是使用最新的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')

});

使用Ryan提到的“属性”属性来提供我们正在模板中的#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/

答案 1 :(得分:2)

表示模型的Ember Data对象具有attributes属性,该属性包含给定模型的所有属性。这就是Ember Data的toJSON用于将模型转换为Javascript对象的方法。

您可以使用此attributes属性读取模型属性,然后从实例中提取这些特定属性。这是一个例子。

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

重申一下这里发生了什么。我们正在从App.User读取属性,然后从App.ryan和App.steve中提取值。希望这是有道理的。

相关问题