如何防止javascript / backbone.js克隆模型共享属性

时间:2010-12-22 03:51:00

标签: javascript clone cloning backbone.js

我正在使用backbone.js模型,因此我不知道我的问题是否特定于骨干处理克隆的方式,或者它是否适用于一般的javascript。基本上,我需要克隆一个具有属性属性的模型,该属性分配了一个对象。问题是当我更新父或克隆的属性时,另一个模型也会更新。这是一个简单的例子:

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

记录以下内容:

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

我更希望克隆 a ,以便 b 不会引用其任何属性。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

Backdone不会进行深度克隆,而只会克隆第一级属性。你必须自己克隆这些值(当它是一个例子的哈希或数组时)。

答案 1 :(得分:1)

你可以做到

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

改编自这个答案:How to clone a backbone collection

答案 2 :(得分:1)

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/