2

我正在尝试在对象上使用每个助手并接收:

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

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

有人可以确认吗?

4

1 回答 1

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;
});
于 2013-10-31T14:55:40.007 回答