“无法在arrayWillChange中调用方法'destroy'of undefined”

时间:2013-05-21 00:27:19

标签: ember.js

我认为这是一个非常标准的数组/模板关系设置,但是当我将一个新项目推入数组时,我在Ember的Cannot call method 'destroy' of undefined方法中得到了上述arrayWillChange错误来源:

for (idx = start + removedCount - 1; idx >= start; idx--) {
  childView = childViews[idx];
  if (removingAll) { childView.removedFromDOM = true; }
  childView.destroy(); <-- childView is undefined
}

我之前从未遇到过这个问题。当我从数组中删除一个项目时,这不会发生。只有在补充。下面是一个JSBin的链接,我试图复制该问题。错误不会被抛出,但模板也不会更新。

http://jsbin.com/asemul/2

1 个答案:

答案 0 :(得分:6)

修改

您正在调用array.push而不是array.pushObject - 后者是一个可识别绑定的Ember.js方法,这意味着它会自动更新绑定。把手模板助手{{#each filters}}是对控制器的filters数组的绑定,模板需要知道在更新基础数组时更新。 push不会告诉绑定更新,但pushObject会更新。

这是一个有效的例子(我所做的就是将push推送到pushObject):http://jsbin.com/asemul/6/

这是一个非常常见的错误 - 通常,我发现如果我的模板与底层对象不同步,那是因为绑定有问题,所以这就是我开始寻找的地方。

结束编辑

  1. 我认为您不应该直接设置removedFromDOM - 尝试使用childView.remove()后跟destroy()
  2. 我不确定上下文是什么,但您看过ContainerView还是CollectionView?这两个视图都支持子视图数组,并且可以用更少的代码更好地完成你想要做的事情。