それで、私は大きな問題なくしばらく Backbone を使用してきました。Zombie Viewsの問題とそれらが生成するメモリリークについてはたくさん読んだことがありますが。いくつかの調査の後、ビューを表示する方法を実装しました。これにより、この問題を防ぐことができます。現在、この方法で動作する 2 つのアプリがあり、すべてうまくいっているようですが、この方法が機能することを確認したいと思います。
これらの関数はすべて、アプリの名前空間が定義され、アプリケーションが初期化されてから開始される「App」と呼ばれるメイン アプリケーション オブジェクトで動作します。
まず第一に、私の現在のソリューションは次のように機能します。バックボーン ルーターが URL をキャッチすると、そのページを表示するために必要なすべてのモデル、コレクション、およびビューをインスタンス化しますが、ルーターはビューをレンダリングしません。App オブジェクト内の "contentView" 配列にビューを追加し、App.setAndRenderContentViews
関数を使用してページのレンダリングも App に委任します。
App オブジェクトには、現在アクティブなすべてのビューを含む 2 つの配列があります。それらは「contentViews」および「appendedViews」と呼ばれます。最初のものは、いくつかのモデルまたはコレクションを表示するためにいくつかの「追加されたビュー」を持つことができるメイン ビューです。これらの最後のビューは appendedViews 配列に格納されます。
ルーターが関数を呼び出すたびApp.setAndRenderContentViews
に、アプリケーションは一連のメソッドを実行してすべての「oldViews」を正しく閉じ、新しいビューをレンダリングします。したがって、これまでに使用したコードは次のとおりです。
window.App =
Models: {}
Collections: {}
Views: {}
Routers: {}
contentViews: []
appendedViews: []
setContentViews: (views) ->
@closeViews() unless @contentViews == []
@closeAppendedViews() unless @appendedViews == []
for view in views
@contentViews.push view
return @contentViews
closeViews: ->
for oldView in @contentViews
@closeView(oldView)
@contentViews = []
closeAppendedViews: ->
for oldView in @appendedViews
@closeView(oldView)
@appendedViews = []
closeView: (view) =>
view.unbind()
view.remove()
view.model.off unless view.model == undefined
view.collection.off unless view.collection == undefined
renderContentView: (view) =>
$('#content-layout').append(view.render().el)
renderContentViews: (renderViews) ->
for view in renderViews
@renderContentView(view)
return 1
setAndRenderContentViews: (views, everybody = false) ->
if everybody == false
return Backbone.history.navigate('', trigger: true) unless @session.load().authenticated()
renderViews = @setContentViews(views)
@renderContentViews(renderViews)
pushToAppendedViews: (view) ->
@appendedViews.push view
これがこの問題を処理する良い方法かどうかはわかりません。また、ゾンビ ビューを処理するためのより良い方法があるかもしれません。あなたの一人がこれで私を助けてくれることを願っています。ありがとうございました!