我认为这是一个非常标准的数组/模板关系设置,但是当我将一个新项目推入数组时,我在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的链接,我试图复制该问题。错误不会被抛出,但模板也不会更新。
答案 0 :(得分:6)
修改强>:
您正在调用array.push
而不是array.pushObject
- 后者是一个可识别绑定的Ember.js方法,这意味着它会自动更新绑定。把手模板助手{{#each filters}}
是对控制器的filters数组的绑定,模板需要知道在更新基础数组时更新。 push
不会告诉绑定更新,但pushObject
会更新。
这是一个有效的例子(我所做的就是将push推送到pushObject):http://jsbin.com/asemul/6/
这是一个非常常见的错误 - 通常,我发现如果我的模板与底层对象不同步,那是因为绑定有问题,所以这就是我开始寻找的地方。
结束编辑
removedFromDOM
- 尝试使用childView.remove()
后跟destroy()
。 ContainerView
还是CollectionView
?这两个视图都支持子视图数组,并且可以用更少的代码更好地完成你想要做的事情。