一次调用deleteRecord()过于频繁或过快?

时间:2013-03-03 17:41:56

标签: ember-data

我想删除模型“文章”的所有记录(大约五件)。我这样做:

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() ...)

更新1

只是想通了它也适用于Ember.run.once ...

更新2

我打开了一个GitHub问题:https://github.com/emberjs/data/issues/772

2 个答案:

答案 0 :(得分:4)

正如所讨论的on GitHubforEach() - 循环中断,因为它在删除项目时会破坏索引。

解决方案:

使用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()
} 

这会在不中断索引的情况下销毁每个项目。