Backbone.jsのビューを破棄または削除します


83

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

私は、コントローラに接続するイベントがあるだろう期待していたので、それが前のビューを破棄して新しい要求が来たときに、次に新しいものをロードします。

ビューごとに削除関数を作成せずにこれを行う方法はありますか?


あなたの見解のエコシステムが何であるかの例を挙げていただけますか?あなたの質問は私に一度にページに多くのビューがあると思います。私はあなたがやろうとしていることを完全に視覚化することができないので、あなたが必要とするかもしれない答えを提供することができません。
Bill Eisenhauer 2011

1
これらのすばらしい投稿からの他のいくつかのパターン:lostechies.com/derickbailey/2011/09/15/…coenraets.org/blog/2012/01/…– daedelus_j 2012
20:23

回答:


47

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

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

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

コールバックについては、次のようにします。

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

5
私はこれが正しくないと思います。ビューの削除機能は、そのビューの要素をDOMから削除するだけです(ここを参照)。この男はビューオブジェクトを完全に削除したいと思っていると思います。
Nutritioustim

2
this.remove()は、データとイベントを削除呼び出すjQueryの削除を()、終わる...それでも私はあなたにもモデルにカスタムイベントや変更のような、他のイベントからバインド解除にthis.undelegateEventsを呼び出すために持っていると思います...
2012

21
this.remove()呼び出しthis.stopListening()this.$el.remove()。1つ目は、を使用して追加されたすべてのイベントリスナーを削除しthis.listenTo(...)ます。2つ目は、jQueryを使用して追加したすべてのイベントリスナーを削除します。2つの間では、イベントリスナーを追加する他の手段を使用しない限り、カバーする必要があります。したがって、この答えは正しく、私から+1を取得します。
chowey 2013年

162

ビューが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);

}

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


10
私が見たところ、this.remove()はjQueryのremoveを呼び出す必要があります。これにより、要素がDOMから削除されるだけでなく、それに添付されているデータとイベントも削除されます。したがって、undelegateEventsとremoveDataの呼び出しは必要ないはずです...私は正しいですか?
2012

1
@opensas要素がDOMから削除されているにもかかわらず、イベントはthis.remove()を超えて持続していました。this.undelegateEvents()は、すべてのイベントのバインドを解除するために必要でした。私が言ったように、それはやり過ぎのように感じました、しかしそれはトリックをしました。
sdailey 2012

3
私はそれが好きです。のthis.$el代わりに使用する必要があり$(this.el)ますが;)
mreq

3
私の問題に対する良い答えのための+1、あなたの最初の答えを書くための+1 :)
1nfiniti 2012年

1
私の見解は、それを破壊して再び作成することで再レンダリングされていません。のせいですthis.remove()か?
Raeesaa 2014年

20

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

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

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


8

これは私が使ってきたものです。問題は発生していません。

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

4

現在のバックボーンのドキュメントによると...

view.remove()

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


0

これでうまくいくと思います

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

またしてリスナーを殺さなければならないthis.stopListening()し、次にreturn this良い測定のために
ブランドン

0

あなたは問題を解決する方法を使うことができます!

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]);
}

最初のアプローチは私にとってはうまくいきました。ビューがゴースト化するという同様の問題が発生し、フォームを送信したときに各ビューが再作成されているときにイベントが複数回発生していました
ONYX 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.