javascript/backbone.js のクローンモデルが属性を共有しないようにする方法

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

質問

私は 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 どの属性も参照しません。助けていただければ幸いです。

役に立ちましたか?

解決

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

他のヒント

あなたならできる

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

この回答から適応されたもの: バックボーン コレクションのクローンを作成する方法

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/

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top