2011-10-24 12 views
6

Ho letto nella documentazione del backbone che chiama collection.reset() cancella la raccolta. Voglio sapere se rimuove anche i modelli o continuano a vivere nella memoria?backbone.js: la chiamata a collection.reset() rimuove anche i modelli?

Se non vengono rimossi c'è un modo più semplice per rimuovere tutti i modelli in una raccolta senza iterare attraverso i modelli e chiamando model.remove()?

risposta

3

Quello che stai cercando è, probabilmente, per i modelli da raccogliere. Cioè, nessuno ha più riferimenti a questi modelli, dopo che sono stati rimossi dalla collezione.

Backbone fa la sua parte rimuovendo i riferimenti che ha impostato sui modelli, quando vengono rimossi dalla raccolta. Tuttavia, devi fare la tua pulizia se il tuo codice ha riferimenti a quei modelli. Il più delle volte, questo accade se quei modelli sono registrati come listener di eventi, come in questo esempio: http://jsfiddle.net/dira/4uxp4/2/

Dando uno sguardo al the implementation of reset, si potrebbe cambiare _removeReference per chiamare una funzione di pulizia del modello pure. E nel modello, rimuovi il modello da tutti gli ascoltatori/tutti gli altri oggetti che mantengono un riferimento ad esso.

+2

Non escludere o modificare i metodi o proprietà di sottolineatura-prefisso. Vedi la mia risposta, sotto per una spiegazione. –

3

È possibile ascoltare l'evento reset dal modello ed effettuare la pulizia e this.destroy() in risposta. Ecco a cosa servono gli hook dell'evento. Vedere http://backbonejs.org/#Events-catalog

Nota: non è assolutamente necessario modificare o sovrascrivere alcun metodo o proprietà preceduto da un carattere di sottolineatura, ad esempio _removeReference. I caratteri di sottolineatura indicano che è inteso come un metodo o una proprietà interna e che le implementazioni interne potrebbero cambiare (le loro API sono considerate instabili). L'aggiornamento di Backbone potrebbe interrompere qualsiasi codice che si basa su metodi con prefisso, anche se la versione è pubblicizzata come una modifica compatibile con le versioni precedenti.

So che la tua domanda dice "senza iterare", ma è davvero il modo più affidabile per gestirlo. Considera un caso in cui un modello è stato spostato da una raccolta all'altra, ma è ancora in ascolto sull'evento reset della prima raccolta (perché un programmatore sei mesi dopo non ha notato la connessione).

Ora, quando viene ripristinata la prima raccolta, il modello spostato viene distrutto. Oops!

L'iterazione sulla raccolta probabilmente è il modo migliore per gestirlo se non si dispone di un endpoint sull'API che eliminerà tutti gli oggetti in una raccolta in batch sul server API (che è spesso il modo in cui viene gestito) .

Per fortuna, che l'iterazione è piuttosto semplice:

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] non ha funzionato per me, this.models.first() ha funzionato –

Problemi correlati