web-dev-qa-db-ja.com

Backbone.jsでビューを破棄または削除する

現在、ビューのdestroy/removeメソッドを実装しようとしていますが、すべてのビューで機能する一般的なソリューションを取得することはできません。

コントローラーにアタッチするイベントがあることを期待していたので、新しいリクエストが来ると以前のビューが破棄されますthenは新しいビューをロードします。

各ビューの削除機能を構築せずにこれを行う方法はありますか?

81
Ad Taylor

すべての情報を知らずに...リセットトリガーをモデルまたはコントローラーにバインドできます。

this.bind("reset", this.updateView);

ビューをリセットする場合は、リセットをトリガーします。

コールバックのために、次のようなことをしてください:

updateView: function() {
  view.remove();
  view.render();
};
47
joshvermaire

ビューがDOMから削除されるだけでなく、イベントから完全に解放されることも絶対に確認する必要がありました。

destroy_view: function() {

    // COMPLETELY UNBIND THE VIEW
    this.undelegateEvents();

    this.$el.removeData().unbind(); 

    // Remove view from DOM
    this.remove();  
    Backbone.View.prototype.remove.call(this);

}

私にはやり過ぎのように見えましたが、他のアプローチでは完全にうまくいくわけではありませんでした。

161
sdailey

私はパーティーに遅れていることを知っていますが、これが他の誰かに役立つことを願っています。バックボーンv0.9.9 +を使用している場合は、listenToおよびstopListeningを使用できます。

initialize: function () {
    this.listenTo(this.model, 'change', this.render);
    this.listenTo(this.model, 'destroy', this.remove);
}

stopListeningは、removeによって自動的に呼び出されます。もっと読むことができます here および here

20
Bassam Mehanni

これは私が使ってきたものです。問題はありません。

destroy: function(){
  this.remove();
  this.unbind();
}
8
JT703

現在のBackboneドキュメントによると...

view.remove()

DOMからビューとそのelを削除し、stopListeningを呼び出して、ビューがlistenToしたバインドイベントを削除します。

4
Dre

これはうまくいくと思う

destroyView : function () {
    this.$el.remove();
}
0
Chhorn Ponleu

問題を解決する方法を使用できます!

initialize:function(){
    this.trigger('remove-compnents-cart');
    var _this = this;
    Backbone.View.prototype.on('remove-compnents-cart',function(){
        //Backbone.View.prototype.remove;
        Backbone.View.prototype.off();
        _this.undelegateEvents();
    })
}

別の方法:このようにグローバル変数を作成します:_global.routerList

initialize:function(){
    this.routerName = 'home';
    _global.routerList.Push(this);
}
/*remove it in memory*/
for (var i=0;i<_global.routerList.length;i++){
    Backbone.View.prototype.remove.call(_global.routerList[i]);
}
0
Deot