2012-01-11 14 views
1

私はBackboneアプリケーションを作成しています。ここでは、サーバーから返されたエンティティを制御できません。Backbone.js:モデルとサーバーのレスポンスの違いを処理する方法

サーバで使用されるJSONとはわずかに異なるデータの内部表現を持つことが便利であることが判明しました。一方の方向では、簡単です:私はModel.parse()メソッドを書くことができます。このメソッドは、サーバーから返されたJSONを入力として受け取り、オブジェクトの属性を返します。

私は他の方向で何をすべきかわかりません。オブジェクトを保存するためにシリアル化されたときに呼び出されるメソッドが見つかりませんでした。 Model.toJSON()がありますが、モデルを保存する前に使用されていないようです。

この違いをどのように処理する必要がありますか?

答えて

2

ファーストアップ - annotated sourceは、バックボーンについての質問に対する回答を見つけるのに最適な場所です。あなたはこのメソッドをオーバーライドすることはあなたが必要なものを達成しなければならない(あなたがemulateJSONを使用していない仮定)モデルはJSON.stringify(model.toJSON())を使用して直列化されていることがわかりますBackbone.syncのソースを見ると

。テストケースを減らさずに、なぜこれがうまくいかないのか説明できません。

サーバとクライアントの同期を完全に制御するには、独自のBackbone.sync実装を作成する必要があります。この方法はかなりシンプルで(注釈付きのソースを参照してください)、簡単な変更を加えたい場合は元のシンクを単純にラップすることができます。例えば

function mySyncFunction(method, model, options){ 
    if(method == 'create' || method == 'update'){ 
    options.contentType = 'application/json'; 
    options.data = model.serializeForServer(); //You will need to write this method 
    } 
    return Backbone.sync(method, model, options); 
} 

だけ

var myModel = Backbone.Model.extend({ 
    ... 

    "sync": mySyncFunction, 

    ... 
}); 
+0

はありがとう、あなたのモデルの一部としてそれを宣言するカスタム同期メソッドを使用するには!私は、バックボーン用のlocalStorageアダプタを使用していましたが、toJSONメソッドは呼び出されませんでした。手動でパッチを当てています。上流に押し込む方法もチェックします – Andrea

関連する問題