【问题标题】:How to bind handlebars to arbitrary property?如何将车把绑定到任意属性?
【发布时间】:2014-02-10 00:33:36
【问题描述】:

我正在尝试绑定到控制器的属性,但属性名称本身存储为控制器的另一个属性。我需要在设计时在不知道属性名称的情况下绑定到属性。这可能吗?或者有什么更好的做事方式?

我正在制作一个将ArrayController 的内容显示为表格的视图。 ArrayController 有一个要显示的属性名称列表 (columnsMeta)。在模板中,我查看了控制器中的所有项目,然后循环遍历所有列并希望绑定列值。

一种尝试是制作一个车把助手来获取属性值:

Ember.Handlebars.registerBoundHelper('getProperty', function(property, obj) {
    return obj.get(property);
});

然后在模板中,将属性名和对象传递给助手:

{{#each row in controller}}
    <tr>
    {{#each col in columnsMeta}}
        <td>{{getProperty col.property row}}</td>
    {{/each}}
    </tr>
{{/each}}

这会在表格中输出正确的文本,并且每条文本都被metamorph 标签包围,但是当我更改模型属性的值时,模板没有更新,它似乎实际上没有被绑定。

这些符号也不起作用:

{{row.[col.property]}}
{{row.[(col.property)]}}

名为“col.property”的属性不存在,不打印任何内容。



我看到 ember-table 项目使用 contentDidChange 并在视图中创建了一个计算属性来为模板提供单元格内容。 Table Cell View in ember-table

但这真的有必要吗?有没有更重的方法?我只是语法错误吗?

谢谢!

【问题讨论】:

  • 你调试过helper吗?
  • 调试助手时我会寻找什么?它以字符串的形式传递属性的正确名称,例如:“id”或“title”,并将 obj 设置为模型。似乎像我期望的那样工作,变形标签在那里......它只是在模型更改时不会更新。
  • 对不起,完全错过了不更新的部分,早上读的太早了。绑定助手监视发送到其中的属性。绑定助手正在从发送的属性之一中获取动态属性。绑定助手正在监视两件事,即对象引用本身和属性名称。由于它们不改变,它不知道更新。

标签: ember.js handlebars.js


【解决方案1】:

一种解决方案可能是将逻辑移出 registerBoundHelper 并移入 ObjectController

控制器代码

App.ColController = Ember.ObjectController.extend({
  needs: ["row"],
  getProperty: function () {
      return this.get('controllers.row.' + this.get('property'));
   }.property('controllers.row.foo', 'controllers.row.bar'),  //this solution may not work if one does not have a finite known set of properties to observe    
});

查看代码:

<script type="text/x-handlebars" data-template-name="row">
   {{#each row in controller}}
     <tr>
      {{#each col in columnsMeta}}
         {{render 'col' col}}
      {{/each}}
      </tr>
  {{/each}}
</script>

<script type="text/x-handlebars" data-template-name="col">
   <td>{{getProperty}}</td>
</script>

【讨论】:

  • 是的,这就是“有限已知集”的问题。不适用于任意名称和数量的属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
  • 2017-05-26
  • 2018-08-08
  • 1970-01-01
相关资源
最近更新 更多