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
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()));
});
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.
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à.
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
non utile quando i modelli ha metodi – OlehZiniak
utilizzare il metodo Backbone Collection clone():
var clonedCollection = myCollection.clone();
clona un collegamento di raccolta, quindi le modifiche in myCollection seguiranno le modifiche in clonedCollection –
Ma io voglio copiare tutti i singoli modelli della collezione. –
Cosa stai cercando di fare che hai bisogno di copiare/clonare tutti i modelli in una collezione? – Paul
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. –