Eine Ansicht in Backbone.js zerstören oder entfernen
Lesezeit: 4 Minuten
Anzeige Taylor
Ich versuche derzeit, eine Methode zum Zerstören/Entfernen für Ansichten zu implementieren, aber ich kann keine generische Lösung für alle meine Ansichten finden.
Ich hatte gehofft, dass es ein Ereignis geben würde, das an den Controller angehängt werden kann, damit, wenn eine neue Anfrage eingeht, vorherige Ansichten zerstört werden dann lädt die neuen.
Gibt es eine Möglichkeit, dies zu tun, ohne für jede Ansicht eine Entfernungsfunktion erstellen zu müssen?
Könnten Sie ein Beispiel dafür geben, was Ihrer Meinung nach ein Ökosystem ist? Ihre Frage lässt mich denken, dass es viele Ansichten auf der Seite gleichzeitig gibt. Ich kann mir nicht ganz vorstellen, was Sie zu tun versuchen und kann daher keine Antwort anbieten, die möglicherweise das ist, was Sie brauchen.
Ich musste absolut sicher sein, dass die Ansicht nicht nur von DOM entfernt, sondern auch völlig losgelöst von Ereignissen 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);
}
Scheint mir übertrieben zu sein, aber andere Ansätze haben den Zweck nicht vollständig erfüllt.
Für das, was ich gesehen habe, sollte this.remove() jQuerys remove aufrufen, das das Element aus dem DOM entfernen sollte, aber auch daran angehängte Daten und Ereignisse entfernen sollte. Also denke ich, dass der Aufruf von undelegateEvents und removeData nicht notwendig sein sollte… Habe ich recht?
– öffnet als
10. September ’12 um 22:42
@opensas Ereignisse blieben über this.remove() hinaus bestehen, obwohl das Element aus dem DOM entfernt wurde. this.undelegateEvents() wurde benötigt, damit alle Ereignisse die Bindung aufheben. Wie gesagt, es fühlte sich übertrieben an, aber es hat den Zweck erfüllt.
– sdailey
13. September ’12 um 18:06
Ich mag das. Obwohl Sie verwenden sollten this.$el anstatt $(this.el) 😉
– mreq
21. September ’12 um 12:36
+1 für eine gute Antwort auf mein Problem, +1 für das Schreiben Ihrer ersten Antwort 🙂
– 1nfiniti
17. November ’12 um 18:38
Meine Ansicht wird nicht neu gerendert, wenn ich sie zerstöre und neu erstelle. Ist es wegen this.remove()?
– Raeesaa
17. März ’14 um 7:54
Ohne alle Informationen zu kennen … Sie könnten einen Reset-Trigger an Ihr Modell oder Ihren Controller binden:
this.bind("reset", this.updateView);
und wenn Sie die Ansichten zurücksetzen möchten, lösen Sie einen Reset aus.
Ich glaube nicht, dass das richtig ist. Die Entfernungsfunktion der Ansicht entfernt einfach das Element dieser Ansicht aus dem DOM (siehe hier). Ich denke, dieser Typ möchte das Ansichtsobjekt vollständig entfernen.
– nahrhafte Zeit
16. Mai ’12 um 13:52
this.remove() ruft schließlich jquerys remove() auf, das auch Daten und Ereignisse entfernt… Trotzdem denke ich, dass Sie auch this.undelegateEvents aufrufen müssen, um die Bindung von anderen Ereignissen wie benutzerdefinierten Ereignissen oder Änderungen am Modell aufzuheben.
– öffnet als
10. September ’12 um 23:28
this.remove() Anrufe this.stopListening() und this.$el.remove(). Die erste entfernt alle Ereignis-Listener, die mit . hinzugefügt wurden this.listenTo(...). Die zweite entfernt alle Ereignis-Listener, die mit jQuery hinzugefügt wurden. Zwischen den beiden sollten Sie behandelt werden, es sei denn, Sie haben andere Methoden zum Hinzufügen von Ereignis-Listenern verwendet. Diese Antwort ist also richtig und bekommt +1 von mir.
– chowey
8. März ’13 um 23:22
Bassam Mehanni
Ich weiß, dass ich zu spät zur Party komme, aber hoffentlich wird dies für jemand anderen nützlich sein. Wenn Sie Backbone v0.9.9+ verwenden, können Sie Folgendes verwenden: listenTo und stopListening
Entfernt eine Ansicht und ihr el aus dem DOM und ruft stopListening auf, um alle gebundenen Ereignisse zu entfernen, die die Ansicht mit listenTo’d versehen hat.
Chhorn Ponleu
Ich denke das sollte funktionieren
destroyView : function () {
this.$el.remove();
}
Sie könnten den Weg nutzen, um das Problem zu lösen!
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]);
}
Der erste Ansatz funktionierte für mich, ich hatte ein ähnliches Problem mit dem Ghosting von Ansichten und die Ereignisse wurden mehrmals ausgelöst, wenn jede Ansicht neu erstellt wurde, als Sie das Formular abschickten
– ONYX
8. Januar ’17 um 22:30 Uhr
.
3803300cookie-checkEine Ansicht in Backbone.js zerstören oder entfernenyes
Könnten Sie ein Beispiel dafür geben, was Ihrer Meinung nach ein Ökosystem ist? Ihre Frage lässt mich denken, dass es viele Ansichten auf der Seite gleichzeitig gibt. Ich kann mir nicht ganz vorstellen, was Sie zu tun versuchen und kann daher keine Antwort anbieten, die möglicherweise das ist, was Sie brauchen.
– Bill Eisenhauer
6. Juli ’11 um 0:35
einige andere Muster aus diesen tollen Beiträgen: lostechies.com/derickbailey/2011/09/15/… coenraets.org/blog/2012/01/…
– daedelus_j
9. Mai ’12 um 20:23