85

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

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

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

4

7 に答える 7

163

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

}

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

于 2012-07-18T03:53:37.550 に答える
48

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

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

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

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

updateView: function() {
  view.remove();
  view.render();
};
于 2011-07-08T06:48:52.460 に答える
20

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

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

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

于 2013-03-11T22:51:24.963 に答える
8

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

destroy: function(){
  this.remove();
  this.unbind();
}
于 2012-08-14T20:52:17.800 に答える
4

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

view.remove()

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

于 2016-02-11T03:46:41.070 に答える
0

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

destroyView : function () {
    this.$el.remove();
}
于 2015-05-12T08:56:27.220 に答える
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]);
}
于 2016-05-10T14:16:24.300 に答える