是否可以在Handlebars.js中使用Ember.js的几个不同底层模型使用一个通用模板?

时间:2014-04-23 02:12:52

标签: javascript templates ember.js handlebars.js

我在Ember中定义了几个(10+)个不同的模型并设置了资源路径。 Everythings工作正常。虽然每个模型都有不同的属性,但我想节省编写冗余代码的时间。 让我们先从模型开始。以下是一些例子......

型号: 客户

App.Client = DS.Model.extend({               
    name: DS.attr('string'),
    clientId: DS.attr('string'),
    clientSecret: DS.attr('string'),
    trustedClient: DS.attr('boolean')
});

型号:

App.Group = DS.Model.extend({               
    name: DS.attr('string'),
    groupType: DS.attr('string')
});

型号: 用户

App.User = DS.Model.extend({               
    email: DS.attr('string'),
    password: DS.attr('string'),
});

以及更多......

问题:

是否可以使用一个而非10 + )把手模板为每个属性和值组合生成标签和文本字段?

我从this question here on stackoverflow得到了一些想法。定义一般模板似乎非常有用。

<script type="text/x-handlebars" data-template-name="general-table-output">
    {{#each metadata}}
        <label>{{name}}</label>
        {{input valueBinding='name'}}        
    {{/each}}
</script>

然后我们可以使用渲染助手将模型传递给general-table-output的控制器。这是用户

的示例
<script type="text/x-handlebars" data-template-name="user">
    {{render 'general-table-output' user}}
</script>

直到这里一切似乎都很好......但控制器似乎没有找到模型的属性。

控制器

App.GeneralTableOutput = Ember.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')
});

问题

attributeMap: undefined

您是否知道在控制器中访问指定模型的方法并映射出所有属性/值,以便可以在通用模板中查看?

1 个答案:

答案 0 :(得分:0)

使用Ember Data时获取属性有点棘手。这是因为Ember Data覆盖了Ember.get的默认实现,因此当您在Ember Data对象上调用get时,它会跳过模型属性(脏或已提交)的内部属性等。您需要Ember.get(this.get('content'), 'constructor.attributes')

http://emberjs.jsbin.com/OxIDiVU/394/edit