Comment éviter un javascript / Backbone.js modèle cloné à partir des attributs de partage
-
12-10-2019 - |
Question
Je travaille avec des modèles de Backbone.js, donc je ne sais pas si ma question est particulière aux poignées de squelette façon clonage ou si elle applique à javascript en général. En gros, je dois cloner un modèle qui a une propriété d'attribut assigné un objet. Le problème est que lorsque je mets à jour le parent ou l'attribut de clone, l'autre modèle est également mis à jour. Voici un exemple rapide:
var A = Backbone.Model.extend({});
var a = new A({'test': {'some': 'crap'}});
var b = a.clone();
a.get('test')['some'] = 'thing';
// I could also use a.set() to set the attribute with the same result
console.log(JSON.stringify(a))
console.log(JSON.stringify(b))
qui enregistre les éléments suivants:
{"test":{"some":"thing"}}
{"test":{"some":"thing"}}
Je préfère clone a tels que b ne sera pas l'un de ses référentes attributs. Toute aide serait appréciée.
La solution
Backdone ne fait pas un profond clone, mais seulement le premier niveau des attributs clone. Vous devez cloner les valeurs vous-même (quand il est un hachage ou d'un tableau par exemple).
Autres conseils
Vous pouvez faire
var A = Backbone.Model.extend({});
var a = new A({'test': {'some': 'stuff'}});
var b = new A(a.model.toJSON());
Adapté de cette réponse: Comment cloner une collection de colonne vertébrale
var A = Backbone.Model.extend({});
var a = new A({'test': {'some': 'stuff'}});
var b = a.clone();
b.attributes = $.extend(true, {}, b.attributes);
// try to overwrite "some" without affecting "a" model
var someStuff = {'test': {'some' : 'other stuff'}};
b.set(someStuff);
console.log(a.toJSON());
console.log(b.toJSON());