2011-10-24 4 views
6

バックボーンのドキュメントで、collection.reset()という呼び出しがコレクションを消去することを確認しました。私はそれがモデルを取り除くかどうか、また彼らが記憶に住み続けているかどうかを知りたいですか?backbone.js:collection.reset()を呼び出すとモデルも削除されますか?

削除されていない場合は、モデルを繰り返し処理せずにコレクション内のすべてのモデルを削除し、model.remove()を呼び出すことなく簡単に削除できますか?

答えて

3

おそらく、モデルがガベージコレクションされている可能性があります。つまり、誰もコレクションから削除された後、これらのモデルへの参照はもうありません。

バックボーンは、コレクションから削除されたときにモデルで設定した参照を削除する役割を果たします。ただし、コードにこれらのモデルへの参照がある場合は、独自のクリーンアップを行う必要があります。時間のほとんどは、これらのモデルは、この例のように、イベントリスナーとして登録されている場合は、この問題が発生した:http://jsfiddle.net/dira/4uxp4/2/

the implementation of resetを見てみると、あなたは同様のモデルにクリーンアップ関数を呼び出す_removeReferenceを変更することができます。モデルでは、すべてのリスナー/それを参照する他のすべてのオブジェクトからモデルを削除します。

+2

は、アンダースコア、接頭辞のメソッドやプロパティをオーバーライドしたり、変更しないでください。説明については私の答えを見てください。 –

3

resetイベントをモデルから聞いて、クリーンアップとthis.destroy()の応答で行うことができます。イベントフックのためのものです。 http://backbonejs.org/#Events-catalog

注:_removeReferenceのように、接頭辞の前にアンダースコアを付けたメソッドやプロパティは絶対に変更しないでください。アンダースコアは内部メソッドまたはプロパティとして意図され、内部実装が変更される可能性があることを意味します(APIは不安定とみなされます)。 Backboneをアップグレードすると、たとえリリースが下位互換性のある変更として宣言されていても、アンダースコアの前に付いたメソッドに依存するコードがすべて破損する可能性があります。

私はあなたの質問が「反復なし」と言うことを知っていますが、実際にこれを処理する最も信頼できる方法です。モデルがコレクションから別のコレクションに移動された場合を考えてみましょう。ただし、最初のコレクションのresetイベントを聞いています(6ヶ月後にプログラマーが接続を認識しなかったためです)。

最初のコレクションがリセットされると、移動したモデルが破棄されます。おっとっと!

APIにエンドポイントを持たず、コレクション内のすべてのオブジェクトをAPIサーバー上でバッチで削除する(これがしばしば処理される方法です)場合は、コレクションを反復処理するのがおそらくこれを処理する最良の方法です。

幸いにも、その反復は非常に簡単です:

destroyAll: function() { 
    var promises = []; 

    while(this.models.length > 0) { 
    promises.push(this.models[0].destroy()); 
    } 

    // handle errors communicating with the server 
    $.when(promises).fail(function (response) { 
    this.trigger('syncError', 
     response); 
    }.bind(this)); 
} 
+0

this.models [0]は私のためには機能しませんでしたが、this.models.first()は –

関連する問題