2011-09-14 12 views

答えて

5

はいとはい。モデルに.toJSON()を呼び出す

は、それの属性を複製し、これは他のモデルに渡すことができます。

var m1 = new MyModel({foo: "bar", baz: "widget"}); 
var attrs = m1.toJSON(); 
var m2 = new MyModel(attrs); 

console.log(m2.get("foo")); //=> "bar" 
console.log(m2.get("baz")); //=> "widget" 
+0

「var m2 = new MyModel(m1.attributes);」を実行するのではなく、なぜあなたをtoJSONで実行しますか? – fancy

+2

を実行すると、m1.attributesという参照がm2に渡されます。これは 'm2.set({foo:" change "})'を呼び出すと、m1も変更されることを意味します: 'm1.get(" foo ")// =>" change "' '.toJSON()'を呼び出すことで、モデルを互いに独立させることができます。 –

+0

awesome、thanks – fancy

1

答えは、あなたが最大限に状態を保持するかどうかに依存します。バックエンドを通じて完全な状態を維持したくない場合、そのような場合、属性ハッシュに保持するデータメンバーと、残りのメンバーをモデルインスタンスの直接データメンバーとして持つことができ、デフォルトの永続性モデルをバックボーンはそれがやり方で動作します。 しかし、モデルのインスタンスメンバーだけでなく、属性を使用して定義された状態を持つためのフリップサイドがあります。インスタンスのデータメンバーは、属性ハッシュのメンバーがどこにあるか観察できません。オブザーバーをバインドしてこれらの属性を変更することができます。基本的には、Backboneによって提供されるゲッターとセッターが対象です。一言で言えば、あなたの全体の状態は観察可能なままで止まります。モデルインスタンスのデータメンバーの変更を状態変化としてプログラムで検出することはできません。これは、特に同期を呼び出すための状態変更を検出している場合には気にする必要はありません。 この問題を解決するには、それが問題であれば、モデルの状態を定義するすべてのパラメータを属性ハッシュに含めることができるため、確実に状態の変化を検出してtoJSON関数をオーバーライドして、あなたは永続する必要があります。このアプローチの特徴は、多くの場合、モデル状態の変化を検出するときに、保持したい状態のどれも変更されていない可能性が非常に高いことです。 要件に応じて選択してください。

関連する問題