2011-08-25 18 views
11

Backbone.JSを使用すると、新しいモデルを作成してサーバーに保存することができます。彼らは正常にajax呼び出しを行い、購読されたUI要素は適切に更新されます。私が次に実行する問題は、新しく作成されたオブジェクトのIDがわからないということです。新規作成時にモデルIDを取得する方法は?

私の作成呼び出しのレスポンスヘッダーには、最後のパラメータが新しく作成されたIDであるLocation https://localhost/rest/beta/mobile/footer/OTo3Njowのような場所ヘッダーが返されていることがわかります。

backbone.syncを上書きせずにこのIDを取得するにはどうすればよいですか? backbone.syncをオーバーライドする必要がある場合、最もクリーンな方法は何ですか?

UPDATE私の組織がそうでなければ、私はIDをキャッチし、そこに割り当てを行うことができ、モデルの解析方法は、XHRオブジェクトへの参照を提供しないような古いBACKBONE.JSを使用しているように見えます

答えて

10

サーバーが戻って送信する必要がありますモデルのidを含むJSONオブジェクト、および更新する他の属性。そうした場合、Backboneは自動的にIDを取得します。

これはオプションではない場合は、Backbone.syncをオーバーライドする必要があります。これは、API(応答ボディではなく場所ヘッダー内の新しいIDを伝達する)が、バックボーンがサポートしているものに準拠していないためです。


サーバーがすでにこれを実行していて、IDを取得したい場合は、誰が知る必要があるかによって異なります。それはmodel.save()を呼び出すコードだ場合、それは成功コールバックに渡すことができます。

model.save({}, { 
    success: function(){ 
     // do something with model.id 
    } 
}); 

モデル自体を通知する必要がある場合は、IDを取得するとき、あなたは初期化子を使用することができます

var MyModel = Backbone.Model.extend({ 
    initialize: function(){ 
     this.bind("change:id", function(){ 
      // … 
     }); 
    } 
}); 
1

私はbackbone.syncに

// Return XHR on success 
params.success = function(response, text, XHR) { 
    if(_.isFunction(model.xhrParse)) { model.xhrParse.call(model, response, XHR); } 
    success.call(model, response); 
} 

を成功PARAMをオーバーロードすることによって、これを解決し、私のベースモデル「xhrParse」に新しいメソッドを追加することによって:

xhrParse: function(resp, XHR) { 
    var locationHeader = XHR.getResponseHeader('Location'); 
    if(locationHeader && !this.id) { 
    var xplode = locationHeader.split("/"); 
    this.id = xplode[xplode.length - 1]; 
    } 
    return resp; 
} 
+2

'this.set( 'id'、...)'を使用します。モデルのIDが変更されると、他のことが起こる必要があります。モデルの属性オブジェクトでIDが更新されます。モデルがコレクション内にあれば、コレクションにIDなどがあることを通知する必要があります。 – s4y

+0

非常に良いキャッチです。ありがとうございました。 –

関連する問題