Kopiowanie ekstraktu z interesującego blog post, który ostatnio czytałem. Mam nadzieję, że to pomoże.
Unikanie typowych pułapek szkieletowych: Tworzenie wycieków pamięci przez nie Rozpinanie wydarzeń
Wspólny wzór w backbone.js tworzy widoki, które słuchają w sprawie zmian w modelach lub kolekcji. Ta technika ma zwykle na celu umożliwienie automatycznego renderowania widoku po zmianie danych. Oznacza to również, że w przypadku dużych kolekcji możemy uzyskać wiele widoków (przynajmniej jeden dla każdego modelu w kolekcji), które możemy dynamicznie tworzyć lub niszczyć na podstawie zmian danych.
Problem powstaje, gdy usuwamy widok (zwykle wywołując jego metodę .remove()), ale zapominając o odwiązaniu metod nasłuchujących na zmianach modelu. W takim przypadku, nawet jeśli nasz kod nie może już zawierać odniesienia do tego widoku, to nigdy nie jest zbiorem śmieci, ponieważ model nadal posiada takie odniesienie za pośrednictwem procedury obsługi zdarzenia.
Weź ten pogląd na przykład:
var SomeModelView = Backbone.View.extend({
initialize: function() {
this.model.on('change', this.render, this);
},
render: function() {
// render a template
}
});
Po wywołaniu metody .Wykręcić(), to „zmiana” obsługi zdarzeń (nasza funkcja render) jest nadal związany. Tak więc, podczas gdy element DOM może zostać usunięty, sam obiekt widoku nigdy nie jest zwalniany z pamięci.
Rozwiązanie problemu jest łatwe (szczególnie od wersji Backbone 0.9.x) - wystarczy, że przestaniemy używać .on() podczas wiązania procedury obsługi zdarzeń. Zamiast tego, możemy użyć nowej metody .listenTo() w następujący sposób:
initialize: function() {
this.listenTo(this.model, 'change', this.render);
}
Największą różnicą jest przesunięcie odpowiedzialności z modelu do widoku. Oznacza to, że za każdym razem, gdy wywołujemy funkcję .remove(), widok automatycznie odwiąże każde zdarzenie z nim związane przy użyciu metody .listenTo(), w istocie naprawiając ten typowy przeciek.
Niektóre pokrewne dyskusje w [to pytanie] (http://stackoverflow.com/questions/14041042/backbone-0-9-9-difference-between-listent-and-on) – explunit