Wie ein Javascript / Backbone.js geklont Modell von der gemeinsamen Nutzung Attribute verhindern
-
12-10-2019 - |
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.
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());