我想删除模型“文章”的所有记录(大约五件)。我这样做:
CMS.ArticlesController = Em.ArrayController.extend
deleteAll: ->
@get("content").forEach (article) ->
article.deleteRecord()
然而,在执行时,它在三篇文章之后说:
Uncaught TypeError: Cannot call method 'deleteRecord' of undefined
虽然使用了一点延迟但它有效:
CMS.ArticlesController = Em.ArrayController.extend
deleteAll: ->
@get("content").forEach (article) ->
setTimeout( (->
article.deleteRecord()
), 500)
为什么?
(我使用Ember.js-rc.1和Ember Data rev 11以及{em> @rpflorence 的ember-localstorage-adapter
,但我认为没有关系,因为我没有先致电commit()
...)
只是想通了它也适用于Ember.run.once
...
我打开了一个GitHub问题:https://github.com/emberjs/data/issues/772
答案 0 :(得分:4)
正如所讨论的on GitHub,forEach()
- 循环中断,因为它在删除项目时会破坏索引。
解决方案:
使用toArray()在另一个数组中“复制”它:
@get("content").toArray().forEach(article) ->
article.deleteRecord()
如果有类似forEachInReverse
的函数,那么更好的方法是向后循环,所以即使删除了项目,丢失的索引也不会损坏循环。
答案 1 :(得分:0)
我仍然遇到上述答案的问题。相反,我使用了反向循环:
for(var i = items.length - 1; i >= 0; i--) {
items.objectAt(i).destroyRecord(); // or deleteRecord()
}
这会在不中断索引的情况下销毁每个项目。