【问题标题】:Is it possible to use one generic template for several different underlying models in Handlebars.js with Ember.js?是否可以在带有 Ember.js 的 Handlebars.js 中为多个不同的底层模型使用一个通用模板?
【发布时间】:2014-04-23 10:41:44
【问题描述】:

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

型号: 客户

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>

然后我们可以使用渲染助手将模型传递给通用表输出的控制器。这是用户的示例。

<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

你知道一种方法可以访问控制器中分配的模型并映射出所有属性/值,以便可以在通用模板中查看吗?

【问题讨论】:

    标签: javascript templates ember.js handlebars.js


    【解决方案1】:

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

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

    【讨论】:

    • var constructor = model.get('firstObject.constructor'); var a = Em.get(constructor, 'attributes'); 这工作正常,但仍然感觉像在对抗 ember。
    • 制作像这样的通用物品会导致不得不使用 Ember 的内部结构,通常我会避免使用它,因为那样你往往会失去一些内置功能,但这完全取决于你是什么尝试构建。
    • 是的...有同样的印象。我将尝试将事物分解为组件和部分。谢谢你的建议。
    猜你喜欢
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    • 2022-01-24
    • 2019-03-13
    • 2012-07-26
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多