0

Web アプリケーションにはバックボーン以外の従来のコードがいくつかあります。views既存の DOM 要素にアタッチしますが、特定の DOM 要素を削除するまだリファクタリングされていないコードがいくつかあります。つまり、delete 呼び出しはビューを経由せず、jQuery 呼び出しに似ています。$('#domID').remove();

バックボーン ビューがおそらくゾンビとしてぶらぶらしているようなしつこい感じがありますが、それを見る方法はありませんか? これは有害ですか?リファクタリングを優先し、すべての削除をビューと呼び出しを介してview.remove()適切view.unbind()に削除する必要がありますか?

DOM ノードが個別に削除された場合、ビューはガベージ コレクションされますか? 何らかのイベントにバインドされている場合はそうではないと思いますが、そうでない場合はどうなりますか?

4

1 に答える 1

5

ビューは、どこかに参照がある場合にのみ残ります。考慮すべき浮遊参照のソースが 4 つあります。

  1. モデルやコレクションへのバインディングthis.collection.on('reset', this.render)など。
  2. ビューのevents.
  3. 直接$(...).on(...)呼び出しによる DOM オブジェクトへのバインディング。
  4. などの単純な古い変数参照this.current_view = new V(...)

(1)は通常、ビューのremoveメソッドによって処理され、remove自分で呼び出す必要があります.BackboneまたはjQueryには、これを行うことができるものは何もありません. 例: http://jsfiddle.net/ambiguous/e574Z/

(2)簡単です。バックボーン ビューは、単一のdelegate呼び出しを使用して、ビューのイベントをビューの にバインドしますelelそのため、単純なビューを削除すると$(x).remove()、イベント参照がなくなります。ただし、異なるビューを同じにアタッチする場合は、 を呼び出してデタッチするel必要があります。これは通常、メソッドで行われます。undelegateEventsdelegateremove

remove: function() {
    this.undelegateEvents();
    return this;
}

removeしかし、繰り返しになりますが、どこかで自分自身を呼び出す必要があります。

(3)はまれですが、ウィンドウ スクロール イベント、ダイアログのボディ クリック イベントなどの場合に必要になることがあります。もちろん、バックボーンは背後で何をしているのかを知ることができず、バインドしている要素がビューの外側にあるため、これらを自分でクリーンアップする必要がありますel(または(2)になります) 。 . これらをどこで掃除しますか?方法はremoveもちろん。

(4)は、いつものように、あなた次第です。通常、この種のことは次のように処理されます。

if(this.current_view)
    this.current_view.remove();
this.current_view = null;

はい、またありremoveます。


したがって、 (2)のようなものしかない場合$('#domID').remove();は問題なく、ゾンビを残す必要はありません。実際、デフォルトのremove実装は公正this.$el.remove()であり、ドキュメントには次のように書かれています。

削除する view.remove()

DOM からビューを削除するための便利な関数。呼び出しに相当$(view.el).remove();

ただし、おそらく(1)のようなものも含まれているため、すべてのメソッドを追加/更新し、ビューを削除するためremoveに呼び出すことをお勧めします。view.remove()

于 2012-07-15T19:09:22.290 に答える