Backbone.Model.save 呼び出しを正しく形成するのに問題があります。私が呼び出している Web サービスは URL パラメーターを使用しますが、Javascript にあるのは変更されたフィールドのオブジェクトです。たとえば、オブジェクト{foo: 'bar', yar: 'har'}
があり、Backbone.Model.save で次のような URL にパッチ リクエストを送信するようにしたいとします。http://server/path/to/service?foo=bar&yar=har
シンプルですね。とにかく色々と迷惑をかけています。これまでに得たものは次のとおりです(これは機能しません。成功/エラーのコールバックもありますが、それらは質問にとって重要ではないと思います):
object =
foo: 'bar',
yar: 'har'
model.save object,
patch: true
他のオプションもいくつか試しました:
model.save object,
patch: true
emulateJSON: true
これは contentType を "application/x-www-form-urlencoded" に設定しましたが、これは適切ですが、Backbone.sync によって ajax リクエストで送信されたデータは {model: "{"foo": "bar", "yar" でした。 : "har"}". サービスはそれを取得し、「モデル」プロパティをどうするかわかりません。
model.save object,
patch: true
contentType: "application/x-www-form-urlencoded"
これは単にobject
文字列としてコーディングし、それを に詰め込むだけoptions.data
です。繰り返しますが、サービスはそれをどう処理するかを知りません。
これをサービスの仕様に準拠させる方法について、他に何か考えはありますか? 自分で ajax 呼び出しを行い、モデル (およびそれが属するコレクション) を自分で更新することはできますが、実際にはそうしたくありません。私のために働くajaxリクエストは次のとおりです。
$.ajax
url: "http://server/path/to/service"
type: "PATCH"
data: object
更新:以前の 2 つのオプションが機能しなかった理由は、Backbone.js 自体で明らかです。
// Ensure that we have the appropriate request data.
if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) {
params.contentType = 'application/json';
params.data = JSON.stringify(options.attrs || model.toJSON(options));
}
// For older servers, emulate JSON by encoding the request into an HTML-form.
if (options.emulateJSON) {
params.contentType = 'application/x-www-form-urlencoded';
params.data = params.data ? {model: params.data} : {};
}
これを見て、オブジェクトをオブジェクトに詰め込んoptions.data
で空の属性を送信すれば、おそらくうまくいくと思いました。
model.save {},
patch: true
data: object
どうやら、これはオプション "[object Object]" にパッチを適用しようとしたようです。私はそれがオブジェクトの文字列化を行ったと思います...どこか...しかし、これは正しい答えに近いかもしれません?