【问题标题】:Dynamic bound property for an HTMLBars Helper in EmberEmber 中 HTMLBars Helper 的动态绑定属性
【发布时间】:2015-06-05 02:55:55
【问题描述】:

我有一个属性名称列表attrs,我想对其进行迭代,为每个模型创建一个绑定到该属性的输入。下面表达了我所追求的功能:

{{#each attr in attrs}}
  {{input value=model.get(attr) }}
{{/each}}

当然这实际上不起作用,因为您不能在帮助程序中进行方法调用。我找到了this question,但该解决方案在我的 Ember 版本(1.11.0)中不起作用——我收集是因为 this 在版本 1.11.0 的帮助程序定义中未定义(请参阅here)。

我怎样才能做到这一点?

【问题讨论】:

    标签: javascript ember.js htmlbars


    【解决方案1】:

    如果您只想从模型中获取一个属性,以每个循环的当前值命名,您可以编写如下帮助器:

    Ember.Handlebars.helper('input-helper',
        function(model, attr) {
            return Ember.get(model, attr);
        }
    );
    

    然后像这样使用它:

    {{#each attr in attrs}}
        {{input-helper model attr}} 
    {{/each}}
    

    这将打印名为 attr#each 迭代中从 model 中保存的任何属性

    如果您想将该值绑定到输入,而不是制作助手,您可以制作一个组件或视图来为您执行此操作:

    // component that binds 'object.property' to an input field
    var InputBinderComponent = Ember.Component.extend({
      prop: null, // passed in
      obj: null,   // passed in
      value: null,    // local
    
      onValue: function() {
        var obj = this.get('obj');
        var prop = this.get('prop');
        var value = this.get('value');
        Ember.set(obj, prop, value);
      }.observes('value'),
    });
    

    使用input-binder 组件的模板来实际包含输入:

    {{input type="text" value=value}}
    

    然后在模板中使用:

    {{#each attr in attrs}}
          {{input-binder prop=attr obj=model}}
    {{/each}}  
    

    Here is an Example

    【讨论】:

    • 谢谢,我看到你的绑定示例可以工作。我想知道是否有任何性能影响?我不太了解 Ember 如何处理幕后事务,但这个解决方案似乎是“手动”绑定值,而不是使用 Ember 的内置绑定功能。但也许没关系。谢谢!
    • 好吧,考虑到 Ember 不直接提供此功能,您必须添加一个额外的观察和获取/设置值的层。这是必要的,因为我们现在必须适应 Ember 处理绑定的方式,即我们绑定的变量名称必须提前知道并且不能动态确定(除了我上面展示的方式)。但是性能影响并不显着,因为整个框架都是建立在尽可能高效地进行双向绑定的基础上的(至少据我所知)
    猜你喜欢
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 2016-09-17
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    相关资源
    最近更新 更多