2011-12-21 20 views
35

C'è un modo per clonare facilmente Backbone Collection? Mi chiedo il motivo per cui non esiste una build in metodo come per i modelli. Il mio problema è che ho una modella in possesso di una collezione di bambini. Quando clonò la modella. Ho ancora la collezione di childs ma solo con i loro valori predefiniti.Come clonare una collezione backbone

risposta

13

Qual è il tuo caso di utilizzo che desideri clonare la raccolta?

Non esiste una funzione clone incorporata per una raccolta perché non si desidera clonare i modelli all'interno della raccolta. La clonazione di un modello causerebbe l'esistenza di due istanze separate dello stesso modello e se si aggiorna un modello, l'altro non verrà aggiornato.

Se si desidera creare una nuova raccolta in base a determinati criteri, è possibile utilizzare il metodo di filtro della raccolta.

var freshmenModels = studentsCollection.filter(function(student) { 
    return student.get('Year') === 'Freshman'; 
} 

var freshmenCollection = new Backbone.Collection(freshmenModels); 

di andare avanti e clonare i modelli della collezione, è possibile scrivere il seguente codice

var clonedCollection = new Backbone.Collection(); 
studentsCollection.each(function(studentModel) { 
    clonedCollection.add(new Backbone.Model(studentModel.toJSON())); 
}); 
+1

Ma io voglio copiare tutti i singoli modelli della collezione. –

+0

Cosa stai cercando di fare che hai bisogno di copiare/clonare tutti i modelli in una collezione? – Paul

+0

Ho un sacco di prodotti, che possono avere un elenco di prodotti secondari. Quindi quando alcuni li mettono nel cestino devo copiare tutti i sotto prodotti. L'utente può modificare il conteggio del prodotto stesso e per i prodotti secondari. Quindi ho bisogno di una copia dell'originale nel carrello. –

4

Un'altra opzione, se avete bisogno di quanto segue (che è quello che cercavo quando ho trovato questa domanda;)):

  • la copia della collezione dovrebbe essere dello stesso tipo della collezione originale (ad esempio, aver creato il proprio tipo di raccolta che si estende Backbone.Collection)
  • La copia della collezione deve essere creato con le stesse opzioni come l'originale
  • I modelli della copia della raccolta devono essere creati utilizzando il metodo model.clone()

Codice:

var models = original.map(function (model) { return model.clone(); });  
var options = _.clone(original.options);  
var copy = new original.constructor(models, options); 

Un metodo clone generico su Backbone.Collection sarebbe scomodo perché ci saranno sempre sottigliezze sul fatto che i modelli e i loro oggetti nidificati vengano copiati per riferimento o siano essi stessi clonati. I requisiti varieranno selvaggiamente in base al tuo scenario, quindi è stato lasciato che tu scriva ciò di cui hai bisogno.

59

più semplice modo:

var cloned = new Backbone.Collection(original.toJSON()); 

dove original è la collezione di clonare.

È quindi possibile estendere il numero Collection di Backbone per aggiungere il supporto clone w o il supporto ereditarietà.

+2

Questa è un'ottima risposta perché eseguirà un clone profondo, il che significa che clonerà anche i modelli. Se preferisci un clone superficiale in cui una nuova raccolta punta alle stesse istanze del modello, utilizza la risposta di Craig Myles in basso. – Dre

+0

non utile quando i modelli ha metodi – OlehZiniak

7

utilizzare il metodo Backbone Collection clone():

var clonedCollection = myCollection.clone(); 
+1

clona un collegamento di raccolta, quindi le modifiche in myCollection seguiranno le modifiche in clonedCollection –

Problemi correlati