2012-02-11 9 views
1

私は多くのビューを利用するバックボーンのアプリケーションで動作します。私は、ビューをクリアし、新しいものをインスタンス化し、それらをデータで満たすためのルーター(主コントローラーの一種)をインスタンス化する(通常は私が思う)トラップに落ちた。 JavaScriptにはガベージコレクタが組み込まれていますが、メモリのどこかにまだ残っている多くの未使用ビューがアプリケーションの使いやすさを妨げていることに気付き始めます。Backbone.JSのビューのリサイクル

私は、これらのビューをリサイクルする方法があったと思います。私はこれが、新しいモデルでビューのinitialize()を呼び出してから再レンダリングするのと同じくらい簡単だと考えました。残念ながら、これは簡単ではありません。

また、人はこれを行うには良い方法でしょう何...ちょっとビューハンドル、例えば、イベントハンドラやものを「破壊」する

を持っているでしょうか?

答えて

3

ビューがDOMから削除されると、ガベージコレクションされます。もちろんそれをキャッシュしない限り。ビューをキャッシュしてDOMから削除すると、すべてのイベントハンドラもガベージコレクションされます。 jQueryのdetachメソッドのようなものを使用しない限り、イベントハンドラは保持されます。

http://api.jquery.com/detach/

ビューをリサイクルしたい場合は、単に変数にキャッシュします。あなたのrouterのinitメソッド内

は、このような何かを:ビューの名前がキャッシュで利用可能であり、それがある場合は、それを使用している場合、ルートがチェックと呼ばれてその後たび

this.views = {}; 

、それ以外の場合は新しいものを作成します。

someRoute: function() { 
    var view; 
    if (_.has(this.views, 'someRouteView')) { 
     view = this.views.someRouteView; 
    } else { 
     view = new SomeRouteView; 
     this.views.someRouteView = view; 
    } 
    // You have a view now 
} 

新しいビューを作成しない場合は、もう一度、あなたはイベント処理を維持するためにjQueryのdetachメソッドのようなものを使用する必要があります。

+0

どのように初期化しますか?私は具体的にそれを再初期化するカスタム "コンストラクタ"関数を呼び出す必要がありますか?単に "initialize"を呼び出すだけでは仕事はできません – preslavrachev

+0

バックボーンのビューで直接 'initialize'を呼び出すことはありません。他のビューの 'initialize'メソッド内であなたのシミュレート継承をしない限り。ビューはキャッシュされると既に初期化されます。 'new View'を呼び出すと、initメソッドが実行されます。 – Trevor

+0

キャッシュされたビューを使用する唯一のメリットは、パフォーマンスです。ルートが実行されるたびにビューを再レンダリングする必要はありません。 – Trevor

関連する問題