3

私は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"}}

bがその属性を参照しないようにaを複製することをお勧めします。どんな助けでも大歓迎です。

4

3 に答える 3

3

Backdoneはディープクローンを実行しませんが、第1レベルの属性のみを複製します。値を自分で複製する必要があります(たとえば、ハッシュまたは配列の場合)。

于 2010-12-26T23:42:51.843 に答える
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/

于 2014-05-07T12:09:27.357 に答える
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

于 2013-03-29T20:16:26.340 に答える