Ember不支持Handlebars在物体上使用每个物品的能力

时间:2013-10-31 13:01:41

标签: ember.js

我试图在对象上使用每个帮助器并接收:

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

使用最新版本的Ember(1.0)和Handlebars。我最好的猜测是Ember不支持绑定对象,这就是断言触发的原因。

有人可以确认吗?

1 个答案:

答案 0 :(得分:0)

首先,你是对的,Ember本身依赖于作为数组的项目。由于Ember尝试执行并且不重新渲染/重新计算已经完成的项目,因此添加一个数组观察器并观察项目一次更改一个而不是重新渲染整个集合。

每个帮助程序本身实际上支持迭代对象(对象中的键)

Handlebars.registerHelper('each', function(context, options) {
  var fn = options.fn, inverse = options.inverse;
  var i = 0, ret = "", data;

  var type = toString.call(context);
  if(type === functionType) { context = context.call(this); }

  if (options.data) {
    data = Handlebars.createFrame(options.data);
  }

  if(context && typeof context === 'object') {
    if(context instanceof Array){
      for(var j = context.length; i<j; i++) {
        if (data) { data.index = i; }
        ret = ret + fn(context[i], { data: data });
      }
    } else {
      for(var key in context) {
        if(context.hasOwnProperty(key)) {
          if(data) { data.key = key; }
          ret = ret + fn(context[key], {data: data});
          i++;
        }
      }
    }
  }

  if(i === 0){
    ret = inverse(this);
  }

  return ret;
});