2

モデル「Article」の全レコード(5個程度)を削除したい。私はそのようにやっています:

CMS.ArticlesController = Em.ArrayController.extend
    deleteAll: ->
        @get("content").forEach (article) ->
            article.deleteRecord()

ただし、実行中に、3 つの記事の後に次のように表示されます。

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 を @rpflorence と一緒に使用してember-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 に答える