4

現在、バックボーンを使用してアプリを実装しています。メモリ管理の一環として、ビューを切り替えるときにすべてのビューの分解をトリガーします

teardown: ->
  for viewName, view of @subViews
    view.teardown()
  for object, events of @objectEvents
    @_handleObjectEvents("off", object, events)

  @off()
  @remove()
  @undelegateEvents()
  @

このアプローチは、メモリの問題のほとんどを確実に解決するのに十分ですか?ここでの課題は、各ビューのすべてのサブビューを追跡し、クリーンアップの一部としてすべてのメインビューとサブビューのティアダウンを呼び出す必要があることです。

検索を行ったところ、バックボーンにも次の2つのイベントがあることがわかりました。「listenTo」と「stopListening」で、ビューレベルでモデルへのイベントのバインドを制御します。

view.listenTo(model, 'change', view.render);
view.stopListening(model);

私の質問は、分解の実装と「stopListening」の使用の間に重複がありますか?メモリ管理に「stopListening」だけを使用できますか?

4

2 に答える 2

4

簡単に言えば、はい、重複があります。

より複雑な答えは、Backbone 0.9.9 で導入された listenTo/stopListening メソッドです。すでに on/off メソッドを使用していますが、いくつかの便利な追加があります。現在のイベント リスナーを _listeners と呼ばれる内部オブジェクトに保存します。

このオブジェクトを使用する利点は、すべてのリスナーの完全なリストを常に把握できることです。これを反復処理して、特定の要素を削除できます (リスナーは単なる関数であり、関数は単なるオブジェクトであることを思い出してください)。

したがって、次のように呼び出すことができます。

this.stopListening(emitting_object, ["reset", "add"]) // Removes listeners  for "reset" and "add" on emitting_object
this.stopListening(emitting_object) // Removes all listeners on emitting_object
this.stopListening() // Iterates over _listeners object and removes all listeners (probably the most usable case)

したがって、このメソッドを使用すると、teardown メソッドを次のように変換できます。

this.teardown = function(){
  this.stopListening();
  ...
}
于 2013-01-16T06:23:09.340 に答える
3

listenTo メソッドの使用をお勧めします。良い点は、ビューで remove メソッドを使用すると、リッスンしているもので自動的にアンバインド (stopListening を呼び出す) することです。Derrick Bailey によると、events プロパティでイベントのバインドも解除します。

アプリを 0.9.2 から 0.9.9 にアップグレードする過程にあるため (これは実際にはまだ動作します)、すべてのオン/オフを listenTo と stopListening に切り替えるだけです。私はまた、ほとんどの場合、そこに close メソッドを持っています。ただし、念のため、まだ undelegateEvents を呼び出します。イベントのリッスンをまだ取り除いていることを知っていても害はありません。

于 2013-01-16T04:29:32.837 に答える