5

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]" にパッチを適用しようとしたようです。私はそれがオブジェクトの文字列化を行ったと思います...どこか...しかし、これは正しい答えに近いかもしれません?

4

1 に答える 1

2

私が探していたのはへのprocessDataオプションのようjQuery.ajaxです。Backbone.syncデフォルトで次のことを行います。

// Don't process data on a non-GET request.
if (params.type !== 'GET' && !options.emulateJSON) {
  params.processData = false;
}

したがって、オブジェクトをURLパラメーターに処理していませんでした。(jQuery API)

したがって、実用的なコードは次のようになります。

model.save {},
    patch: true
    data: object
    processData: true

実は、Backbone.Modelを全体的に正しく使用していない可能性があります...しかし、少なくとも機能しています。:P

于 2013-01-18T20:58:25.457 に答える