Comment éviter un javascript / Backbone.js modèle cloné à partir des attributs de partage

StackOverflow https://stackoverflow.com/questions/4506025

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.

Était-ce utile?

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());

http://jsfiddle.net/RLWzm/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top