Kopieren eines Extrakts von einer interessanten blog post, die ich kürzlich gelesen habe. Ich hoffe es hilft.
Vermeidung gemeinsame Rückgrat Tücken: Erstellen von Speicherlecks durch nicht Dissoziationsereignisse
Ein gemeinsames Muster in Backbone.js schafft Ansichten, die auf Änderungen in Modellen oder Sammlungen zu hören. Diese Technik soll normalerweise ermöglichen, dass sich die Ansicht automatisch wieder rendert, wenn sich die zugrunde liegenden Daten ändern. Das bedeutet auch, dass wir für große Sammlungen viele Ansichten (mindestens eine für jedes Modell in der Sammlung) haben, die wir basierend auf Änderungen an den Daten dynamisch erstellen oder löschen können.
Das Problem tritt auf, wenn wir eine Ansicht entfernen (normalerweise durch Aufruf der Methode .remove()), aber vergessen, die Methoden zu lösen, die Modelländerungen überwachen. In einem solchen Fall wird, auch wenn unser Code möglicherweise keinen Verweis mehr auf diese Ansicht enthält, niemals eine Garbage Collection durchgeführt, da das Modell über den Event-Handler immer noch eine solche Referenz enthält.
Nehmen Sie diese Ansicht zum Beispiel:
var SomeModelView = Backbone.View.extend({
initialize: function() {
this.model.on('change', this.render, this);
},
render: function() {
// render a template
}
});
Wenn die .remove() -Methode aufrufen, die "change" Event-Handler (unsere Render-Funktion) ist nach wie vor gebunden. Während also das DOM-Element entfernt werden kann, wird das View-Objekt selbst niemals aus dem Speicher freigegeben.
Lösung ist einfach (vor allem seit Backbone 0.9.x) - alles, was wir tun müssen, ist die Verwendung von .on() beim Binden des Ereignishandlers zu stoppen. Stattdessen können wir das neue .listenTo() -Methode wie folgt verwenden:
initialize: function() {
this.listenTo(this.model, 'change', this.render);
}
Der größte Unterschied hier ist die Verschiebung der Verantwortung aus dem Modell zur Ansicht. Dies bedeutet, dass die Ansicht jedes Mal, wenn wir .remove() aufrufen, jedes Ereignis, das an sie gebunden ist, mithilfe der .listenTo() -Methode automatisch löst, wodurch dieses allgemeine Leck im Wesentlichen behoben wird.
Einige verwandte Diskussion in [diese Frage] (http://stackoverflow.com/questions/14041042/backbone-0-9-9-difference-between-listento-and-on) – explunit