如何制作Ember.js把手#each迭代对象?

lxe*_*lxe 9 javascript ember.js

我正在尝试让{{#each}}助手迭代一个对象,就像在香草把手中一样.不幸的是,如果我在一个对象上使用#each,Ember.js版本会给我这个错误:

Assertion failed: The value that #each loops over must be an Array. You passed [object Object]

我写了这个帮手,试图解决这个问题:

Ember.Handlebars.helper('every', function (context, options) {
  var oArray = [];
  for (var k in context) {
    oArray.push({
      key   : k,
      value : context[k]
    })
  }
  return Ember.Handlebars.helpers.each(oArray, options);
});
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试使用时{{#every}},我收到以下错误:

Assertion failed: registerBoundHelper-generated helpers do not support use with Handlebars blocks.

这似乎是一个基本功能,我知道我可能会遗漏一些明显的东西.有人可以帮忙吗?

编辑:

这是一个小提琴:http://jsfiddle.net/CbV8X/

Dan*_*mak 15

从Ember v2.0.0-beta.1开始,您可以使用{{each-in}}帮助程序迭代HTMLBars中的对象属性.你可以像{{each}}帮手一样使用它.

例:

{{#each-in modelWhichIsObject as |key value|}}
  `{{key}}`:`{{value}}`
{{/each-in}}
Run Code Online (Sandbox Code Playgroud)

JS Bin演示.


lxe*_*lxe 2

经过几个小时的摆弄后,我想出了这个奇怪的方法:

Ember.Handlebars.registerHelper('every', function(context, options) {
  var oArray = [], actualData = this.get(context);

  for (var k in actualData) {
    oArray.push({
      key: k,
      value: actualData[k]
    })
  }

  this.set(context, oArray);
  return Ember.Handlebars.helpers.each.apply(this, 
      Array.prototype.slice.call(arguments));
});
Run Code Online (Sandbox Code Playgroud)

我不知道this.set会产生什么影响,但这似乎有效!

这是一个小提琴:http://jsfiddle.net/CbV8X/1/