【问题标题】:Iterate object in Handlebars template在 Handlebars 模板中迭代对象
【发布时间】:2014-10-18 22:41:23
【问题描述】:

如何在 Ember 应用程序中迭代车把模板中的对象?

<div class="alert alert-danger">
  <strong>We couldn't create this Company.</strong>
  {{#each errors}          
    <p>{{this}}</p>
  {{/each}}
</div>

console.log(response.errors);

Object {0: "Name can't be blank", 1: "Zip code can't be blank", 2: "Company type can't be blank", 3: "Address line can't be blank", 4: "Country can't be blank", 5: "State can't be blank"}

我在控制台中得到的错误是:

未捕获的错误:断言失败:#each 循环的值必须 成为一个数组。您通过了{0:姓名不能为空,1:邮政编码不能为 空白,2:公司类型不能为空,3:地址行不能为空, 4:国家不能为空,5:国家不能为空}

有什么建议吗?

【问题讨论】:

  • 将错误重构为数组
  • 你看我下面的回答了吗?您是否愿意详细说明它如何满足或不满足您的要求,因为问题仍然悬而未决?

标签: loops object ember.js each handlebars.js


【解决方案1】:

正如您的控制台错误所述,each 帮助程序仅适用于数组,因此它不能直接适用于您的 errors 对象。但是,您可以为errors 对象创建一个计算属性,并在属性内部使用jQuery.map(或类似的映射函数)将该对象映射到一个数组。

errorsArray: function() {
  return $.map(errors, function( value, key ) {
    return value;
  });
}.property('errors')

【讨论】:

  • 是的,但是很遗憾,当errors中的属性被添加、更改或删除时,这个属性不会更新,除非你调用notifyPropertyChange
  • @torazaburo,这不是规定的要求,但你是对的。有大量的计算属性宏将允许自动转换一种或另一种,但我所知道的一切都不会允许像数组一样对待对象。一个对象在某些方面可以表现得像一个关联数组,但最重要的是它不是一个。也许可以编写一个mixin 来创建必要的observes 设置,但是当你完成所有这些时,你不得不想知道为什么不将模型重新塑造成一个数组。
  • 是的,我并不是要说您不需要将对象重新整形为数组-您这样做是为了#each 覆盖它。我只是指出需要一些额外的机制来保持数组映射是最新的。
猜你喜欢
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-25
  • 1970-01-01
  • 2014-05-06
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多