Wie ein Javascript / Backbone.js geklont Modell von der gemeinsamen Nutzung Attribute verhindern

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

Frage

Ich arbeite mit Backbone.js Modelle, so dass ich weiß nicht, ob meine Frage ist insbesondere auf die Art und Weise Rückgrat Griffe klonen oder wenn es zu Javascript allgemein gilt. Grundsätzlich muss ich um ein Modell klonen, die ein Attribut Eigenschaft hat, ein Objekt zugeordnet. Das Problem ist, dass, wenn ich das übergeordnete oder Klon des Attribut aktualisieren, das andere Modell wird ebenfalls aktualisiert. Hier ist ein kleines Beispiel:

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

, die protokolliert die folgende:

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

Ich würde es vorziehen, Klon a , so dass b wird keine seiner Attribute verweisen werden. Jede mögliche Hilfe würde geschätzt.

War es hilfreich?

Lösung

Backdone does not do a deep-clone, but only clone first level attributes. You have to clone the values yourself (when it is a hash or array for exemple).

Andere Tipps

You could do

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

Adapted from this answer: How to clone a backbone collection

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/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top