2013-03-26 2 views
14

Soweit ich in der Lage zu sagen, listenTo und stopListening sollte on bzw. off ersetzen. Verstehe ich das richtig? Gibt es eine Situation, in der on/off anstelle von listenTo/stopListening verwendet werden sollte?Sollen alle Backbone-Ein/Aus-Ereignisse durch listenTo/stopListening ersetzt werden?

Edit:

Als ich meinen Code ging Refactoring, wurde klar, dass es einige Fälle, für on über listenTo sind. Die documentation ist ziemlich klar, dass es für ist, wenn ein Objekt hört auf ein anderes Objekt:

ein Sagen Objekts auf ein bestimmtes Ereignis auf ein anderen Objekt zu hören.

Wenn daher ein collection oder model auf sich selbst zu einem Ereignis zu hören, sollten wir on anstelle von listenTo.

Angenommen, ich habe das richtig ...

Die einfache Regel ist dies:

Verwenden listenTo, wenn sie auf ein anderes Objekt für Veranstaltungen zu hören. Verwenden Sie on, wenn Sie Ereignisse auf sich selbst hören.

+0

Einige verwandte Diskussion in [diese Frage] (http://stackoverflow.com/questions/14041042/backbone-0-9-9-difference-between-listento-and-on) – explunit

Antwort

10

In den meisten Fällen verstehen Sie es richtig. Hier ist eine Diskussion über die Angelegenheit von ihrem GitHub-Repository: https://github.com/documentcloud/backbone/issues/1923#issuecomment-11462852

listenTo und stopListening verfolgen den Zustand. Es kümmert sich um die Bereinigung für Sie auf Kosten von ein wenig Code Overhead. In fast jedem Fall kann ich daran denken, dass Sie dieses Verhalten für Ihre Ansichten wünschen, aber Sie wären auch nicht schuld, wenn Sie sich selbst an/aus-Gesprächen bedienen; Sie werden nicht bald on und off ablehnen.

+0

Ein Grund, 'on weiter zu verwenden 'ist, wenn Sie einen anderen Kontext als' View' selbst setzen möchten, wenn der Event-Handler ausgelöst wird. 'listenTo' hat kein Kontextargument, da davon ausgegangen wird, dass der Kontext die' Ansicht' sein soll, die das Listening ausführt. – machineghost

14

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.

+2

Gute Zusammenfassung, warum es jetzt ein 'listenTo' gibt. – Bart

+0

Tolle Zusammenfassung :) – Andru

+0

Marionette, eine Bibliothek für Backbone, hat Speicherverwaltung (Zombie-Ansichten usw. zu töten) eingebaut, um diese Art von Speicherlecks zu verhindern. http://marionettejs.com/ –

Verwandte Themen