在 Handlebars 模板中迭代对象

Posted

技术标签:

【中文标题】在 Handlebars 模板中迭代对象【英文标题】:Iterate object in Handlebars template 【发布时间】: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:国家不能为空

有什么建议吗?

【问题讨论】:

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

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

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

【讨论】:

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

以上是关于在 Handlebars 模板中迭代对象的主要内容,如果未能解决你的问题,请参考以下文章

Handlebars模板引擎

Handlebars Block Helper:每个都有排序

如何迭代 Handlebars 中的对象数组?

车把嵌套“每个”语法 - 不迭代每个元素

handlebars

渲染 Marionette/Backbone 视图时将变量传递到 Handlebars 模板