myView = Backbone.View.extend({
//event binding etc etc
render: function() {
//render some DOM
}
})
anotherView = Backbone.View.extend({
events: {
'click .selector doThis'
},
createNewView: function() {
var view = new myView();
}
})
createNewView
は複数回呼び出すことができます。私の理解では、変数view
は、createNewView
関数が完了したときにまだ存在するオブジェクト/コードを参照するため、JavaScriptの組み込みのガベージコレクションによって必ずしも削除されるとは限りません。Backbone.jsで子ビューをインスタンス化するときのメモリリークを回避する方法
これは間違いありませんか?これに対処する方法は?
myApp.view = new myView()
次にcreateNewView
に、私はちょうどこの上でレンダリングを呼び出す:
私の現在のアプローチは、私のアプリのレベルで一度myView
を初期化することで基本的に
myApp.view.render()
、私は今まで1を持っていますそれらの私はそれを再使用します。
代わりのアプローチは、アレイ内のサブビューの作成を追跡し、次にそれらがもはや必要ではないとわかったときに順番にそれぞれ.remove()
を呼び出します。
私は適切なトラックにいますか?
myView
がlistenTo
で他のオブジェクトにバインドされたコールバックを作成した場合、それらは変数を再割り当てするだけでは削除されないため、2番目のアプローチが優れています。つまり、new
を呼び出してビューの新しいインスタンスをインスタンス化する場合、最初に破棄されたインスタンスにremove()
を呼び出す必要があります。
これは、 'on 'ではなく' listenTo'を使用し、すべてを 'off'よりも' stopListening'するほうが簡単な理由です。 –
ありがとうございます。 _.invokeメソッドは、私の_eachループよりも簡単な方法です。 –