Cómo evitar que un / Backbone.js modelo clonado Javascript compartan atributos
-
12-10-2019 - |
Pregunta
Estoy trabajando con modelos Backbone.js, así que no sé si mi pregunta es particular de las asas forma la columna vertebral de clonación o si se aplica a javascript en general. Básicamente, lo que necesito para clonar un modelo que tiene una propiedad de atributo asignado un objeto. El problema es que cuando pongo al día el padre o el atributo del clon, el otro modelo también se actualiza. Aquí está un ejemplo rápido:
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))
que registra el siguiente:
{"test":{"some":"thing"}}
{"test":{"some":"thing"}}
Yo preferiría clon a tal que b no estar haciendo referencia a cualquiera de sus atributos. Cualquier ayuda sería muy apreciada.
Solución
Backdone no hace un profundo-clon, pero sólo atributos clon de primer nivel. Usted tiene que clonar los valores usted mismo (cuando es un hash o matriz para exemple).
Otros consejos
Usted podría hacer
var A = Backbone.Model.extend({});
var a = new A({'test': {'some': 'stuff'}});
var b = new A(a.model.toJSON());
Adaptado de esta respuesta: Cómo clonar una colección columna vertebral
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());