3

.delegateEvents()ページから親ビューを削除してから元に戻した後、イベントを再委任するために、親「コレクション」ビュー内のすべての子ビューを呼び出す必要があります。

これを行うには 2 つの方法がありますが、どちらも適切な慣行という点で私には正しくないように思えます。

  • )が親addOne(ビューで呼び出されるたびに、作成されたばかりの子ビューをリストに保存します。後でビューがページに再度追加されたときに、イベントを再委任する必要がある場合。配列を使用してそのリストをスクロール.delegateEvents()し、各子ビュー アイテムを呼び出します。このアプローチの問題は、ビューがすでに子ビューに影響を与えるバックボーン認可の方法を持っている場合に、ビュー内のすべてを保持するために別の配列を作成することです。this.collection.each()
  • ビュー内の組み込みを使用して、View.collection.each()各子モデルをスクロールします。各モデルで、対応するビューがそれ自体を呼び出すイベントをトリガー.delegateEvents()します。このアプローチの問題点は、純粋にビュー指向のアクションがモデルを介してルーティングされていることです。

これらのアプローチのいずれかが良いですか、それともこれを行うべきより良い方法はありますか?

本当にありがとう!

4

2 に答える 2

1

リスト ビューの削除方法を変更することで、問題全体を回避できる場合があります。

jQuery.remove()関数 (または同じ関数)を呼び出すと、Backbone.View.remove()すべてのイベントの委任が解除され、メモリ リークが回避されます。ただし、後でビューをページに再度追加する予定がある場合は、 を使用jQuery.detach()して、すべてのイベントの委譲を解除せずに DOM から要素を削除できます。その後、後でそれらを再委任する必要はありません。要素を DOM にアタッチするだけで、すぐに使用できます。また、少し速いと思います。

たとえば、いくつかのリスト ビューで次の関数を使用しています。

detach : function(){
  this.$el.detach();
},

attach : function(newParentEl){
  this.$el.appendTo(newParentEl);
}
于 2012-08-01T21:06:47.817 に答える
1

最初のものに行きます。適切な削除と再初期化のために、とにかく CollectionView の子ビューへの参照を保持する必要があります。後者のパターンの問題は、モデルが複数のコレクション ビューで表されている場合、それらのコレクション ビューのすべてが不必要にトリガーされることです。

于 2012-08-01T20:02:27.593 に答える