Domanda

sto lavorando con i modelli backbone.js, quindi non so se la mia domanda è particolare alle maniglie modo backbone clonazione o se si applica a javascript in generale. Fondamentalmente, ho bisogno di clonare un modello che ha una proprietà di attributo assegnato un oggetto. Il problema è che quando aggiorno il genitore o l'attributo di clone, l'altro modello viene aggiornato. Ecco un esempio veloce:

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

, che registra il seguente:

{"test":{"some":"thing"}}
{"test":{"some":"thing"}}

preferirei clone a in modo tale che b non verrà riferimento a uno qualsiasi dei suoi attributi. Qualsiasi aiuto sarebbe apprezzato.

È stato utile?

Soluzione

Backdone non fa un profondo clone, ma solo gli attributi clone di primo livello. È necessario clonare i valori da soli (quando si tratta di un hash o array per exemple).

Altri suggerimenti

Si potrebbe fare

var A = Backbone.Model.extend({});
var a = new A({'test': {'some': 'stuff'}});
var b = new A(a.model.toJSON());

adattati da questa risposta: Come clonare una collezione dorsale

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/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top