wake-up-neo.com

Zerstören oder entfernen Sie eine Ansicht in Backbone.js

Ich versuche derzeit, eine Methode zum Löschen/Entfernen von Ansichten zu implementieren, aber ich kann keine generische Lösung finden, die für alle meine Ansichten funktioniert.

Ich hatte gehofft, dass es ein Ereignis geben würde, das an den Controller angehängt werden kann, damit, wenn eine neue Anforderung eingeht, vorherige Ansichten zerstört werden dann die neuen geladen werden.

Gibt es eine Möglichkeit, dies zu tun, ohne für jede Ansicht eine Entfernungsfunktion erstellen zu müssen?

81
Ad Taylor

Ohne alle Informationen zu kennen ... Sie könnten einen Reset-Trigger an Ihr Modell oder Ihre Steuerung binden:

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

wenn Sie die Ansichten zurücksetzen möchten, lösen Sie einen Reset aus.

Tun Sie für Ihren Rückruf Folgendes:

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

Ich musste absolut sicher sein, dass die Ansicht nicht nur von DOM entfernt, sondern auch von Ereignissen völlig ungebunden war.

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

}

Schien für mich übertrieben zu sein, aber andere Ansätze haben den Trick nicht vollständig geschafft.

161
sdailey

Ich weiß, dass ich zu spät zur Party komme, aber hoffentlich ist das für jemand anderen nützlich. Wenn Sie Backbone v0.9.9 + verwenden, können Sie listenTo und stopListening verwenden.

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

stopListening wird automatisch von remove aufgerufen. Sie können mehr lesen hier und hier

20
Bassam Mehanni

Das habe ich benutzt. Habe noch keine Probleme gesehen.

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

Laut aktueller Backbone-Dokumentation ....

view.remove ()

Entfernt eine Ansicht und ihr Element aus dem DOM und ruft stopListening auf, um alle gebundenen Ereignisse zu entfernen, die die Ansicht abgehört hat.

4
Dre

Ich denke das sollte funktionieren

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

Sie könnten den Weg nutzen, um das Problem zu lösen!

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

Eine andere Möglichkeit: Erstellen Sie eine globale Variable wie folgt: _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