2011-10-24 18 views
6

Przeczytałem w dokumentacji głównej, że wywołanie collection.reset() usuwa kolekcję. Chcę wiedzieć, czy to też usuwa modele, czy też nadal żyją w pamięci?backbone.js: czy wywołanie collection.reset() usuwa także modele?

Jeśli nie są one usunięte, istnieje łatwiejszy sposób na usunięcie wszystkich modeli z kolekcji bez wykonywania iteracji przez modele i wywoływania model.remove()?

Odpowiedz

3

To, czego szukasz, to prawdopodobnie model do zbierania śmieci. Oznacza to, że nikt nie ma już odniesienia do tych modeli, po ich usunięciu z kolekcji.

Szkielet ma swój udział w usuwaniu odniesień ustawionych w modelach po ich usunięciu z kolekcji. Musisz jednak wykonać własne czyszczenie, jeśli Twój kod zawiera odniesienia do tych modeli. Przez większość czasu, to się stanie, jeśli te modele są zarejestrowane jako detektorów zdarzeń, jak w poniższym przykładzie: http://jsfiddle.net/dira/4uxp4/2/

przyjrzeniu the implementation of reset, można zmienić _removeReference wywołać funkcję czyszczenia na modelu, jak również. I w modelu, usuń model ze wszystkich słuchaczy/wszystkich innych obiektów, które zachowują odniesienie do niego.

+2

nie zastępują lub zmienić metody lub właściwości podkreślenia-prefiksem. Zobacz moją odpowiedź, poniżej dla wyjaśnienia. –

3

Można wysłuchać zdarzenia reset z modelu i wykonać swoje czyszczenie i this.destroy() w odpowiedzi. Po to są haczyki zdarzeń. Patrz: http://backbonejs.org/#Events-catalog

Uwaga: Absolutnie nie należy zmieniać ani zastępować żadnej metody ani właściwości poprzedzonej przedrostkiem, na przykład _removeReference. Podkreślenia oznaczają, że ma to być wewnętrzna metoda lub własność, a wewnętrzne implementacje mogą się zmienić (ich interfejsy API są uznawane za niestabilne). Ulepszanie kręgosłupa może złamać dowolny kod, który opiera się na metodzie z podkreśleniem-prefiksem, nawet jeśli publikacja jest reklamowana jako zmiana kompatybilna wstecz.

Wiem, że twoje pytanie mówi "bez powtarzania", ale to naprawdę jest najbardziej niezawodny sposób radzenia sobie z tym. Rozważmy przypadek, w którym model został przeniesiony z jednej kolekcji do drugiej, ale wciąż nasłuchuje na zdarzeniu z pierwszej kolekcji: reset (ponieważ programista sześć miesięcy później nie zauważył połączenia).

Teraz, gdy pierwsza kolekcja zostanie zresetowana, poruszony model zostanie zniszczony. Ups!

Iteracja nad kolekcją prawdopodobnie jest najlepszym sposobem na poradzenie sobie z tym problemem, jeśli nie masz punktu końcowego w swoim interfejsie API, który usunie wszystkie obiekty w kolekcji wsadowej na serwerze API (co często jest obsługiwane) .

szczęście, że iteracja jest całkiem proste:

destroyAll: function() { 
    var promises = []; 

    while(this.models.length > 0) { 
    promises.push(this.models[0].destroy()); 
    } 

    // handle errors communicating with the server 
    $.when(promises).fail(function (response) { 
    this.trigger('syncError', 
     response); 
    }.bind(this)); 
} 
+0

this.models [0] nie działa dla mnie, this.models.first() nie –