web-dev-qa-db-fra.com

Comment cloner une collection de dorsale

Existe-t-il un moyen de cloner facilement Backbone Collection? Je me demande pourquoi il n'y a pas de méthode intégrée comme pour les modèles. Mon problème est que j'ai un mannequin tenant une collection d'enfants. Quand je clone le modèle. J'ai toujours la collection d'enfants mais seulement avec leurs valeurs par défaut.

37
Andreas Köberle

Quel est votre cas d'utilisation pour cloner la collection?

Il n'y a pas de fonction de clonage intégrée pour une collection car vous ne voulez pas cloner les modèles au sein de la collection. Le clonage d'un modèle entraînerait l'existence de deux instances distinctes du même modèle et si vous mettez à jour un modèle, l'autre ne sera pas mis à jour.

Si vous souhaitez créer une nouvelle collection en fonction de certains critères, vous pouvez utiliser la méthode de filtrage de la collection.

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

var freshmenCollection = new Backbone.Collection(freshmenModels);

Pour continuer et cloner les modèles de la collection, vous pouvez écrire le code suivant

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

Manière la plus simple:

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

original est la collection à cloner.

Pourrait toujours étendre Collection de Backbone pour ajouter la prise en charge du clone sans prise en charge de l'héritage.

60
chikamichi

Utilisez la méthode Backbone Collection clone () :

var clonedCollection = myCollection.clone();
8
Craig Myles

Une autre option, si vous avez besoin des éléments suivants (c'est ce que je cherchais lorsque j'ai trouvé cette question;)):

  • La copie de la collection doit être du même type que la collection d'origine (par exemple, vous avez créé votre propre type de collection qui étend Backbone.Collection)
  • La copie de la collection doit être créée avec les mêmes options que l'original
  • Les modèles de la copie de la collection doivent être créés à l'aide de la méthode model.clone ()

Code:

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

Une méthode de clonage générique sur Backbone.Collection serait maladroite car il y aura toujours des subtilités pour savoir si les modèles et leurs objets imbriqués sont copiés par référence ou s'ils sont eux-mêmes clonés. Les exigences varieront énormément selon votre scénario, il vous a donc été laissé d'écrire ce dont vous avez besoin.

4
Dan Malcolm