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?
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();
};
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.
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
Das habe ich benutzt. Habe noch keine Probleme gesehen.
destroy: function(){
this.remove();
this.unbind();
}
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.
Ich denke das sollte funktionieren
destroyView : function () {
this.$el.remove();
}
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]);
}