最近読んだ興味深いブログ投稿からの抜粋をコピーします。それが役に立てば幸い。
一般的なバックボーンの落とし穴の回避:イベントのバインドを解除しないことによるメモリリークの作成
Backbone.jsの一般的なパターンは、モデルまたはコレクションの変更をリッスンするビューを作成することです。この手法は通常、基になるデータが変更されたときにビューが自動的に再レンダリングできるようにすることを目的としています。また、大規模なコレクションの場合、データの変更に基づいて動的に作成または破棄できる多くのビュー(コレクション内のモデルごとに少なくとも1つ)が作成される可能性があることも意味します。
この問題は、ビューを削除するときに発生しますが(通常、その.remove()メソッドを呼び出すことによって)、モデルの変更をリッスンするメソッドのバインドを解除するのを忘れます。このような場合、コードがそのビューへの参照を保持しなくなったとしても、モデルがイベントハンドラーを介してそのような参照を保持しているため、ガベージコレクションされることはありません。
このビューを例にとってみましょう。
var SomeModelView = Backbone.View.extend({
initialize: function() {
this.model.on('change', this.render, this);
},
render: function() {
// render a template
}
});
.remove()メソッドを呼び出すと、「change」イベントハンドラー(レンダリング関数)は引き続きバインドされます。したがって、DOM要素は削除できますが、ビューオブジェクト自体がメモリから解放されることはありません。
これを解決するのは簡単です(特にBackbone 0.9.x以降)-イベントハンドラーをバインドするときに.on()の使用を停止するだけです。代わりに、次のように新しい.listenTo()メソッドを使用できます。
initialize: function() {
this.listenTo(this.model, 'change', this.render);
}
ここでの最大の違いは、モデルからビューへの責任のシフトです。これは、.remove()を呼び出すたびに、ビューが.listenTo()メソッドを使用してバインドされたイベントを自動的にアンバインドし、この一般的なリークを本質的に修正することを意味します。