2

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

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 与@rpflorenceember-localstorage-adapter一起使用,但我认为这无关紧要,因为我还没有打电话……) commit()

更新 1

刚刚发现它也适用于Ember.run.once...

更新 2

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

4

2 回答 2

4

正如GitHub 上所讨论的,forEach()-loop 会中断,因为它会在删除项目时破坏索引。

解决方案:

使用 toArray() 将其“复制”到另一个数组中:

@get("content").toArray().forEach(article) -> 
    article.deleteRecord()

如果有类似的函数,更好的方法forEachInReverse是向后循环,因此即使删除了项目,丢失的索引也不会损害循环。

于 2013-03-05T09:13:37.683 回答
0

我仍然对上述答案有疑问。相反,我使用了反向 for 循环:

for(var i = items.length - 1; i >= 0; i--) {
   items.objectAt(i).destroyRecord(); // or deleteRecord()
} 

这会破坏每个项目而不会破坏索引。

于 2015-03-28T06:25:45.463 回答