5

我在正确形成 Backbone.Model.save 调用时遇到了一些麻烦。我正在调用的 Web 服务使用 URL 参数,但我在 Javascript 中拥有的是已更改字段的对象。例如,我有 object {foo: 'bar', yar: 'har'},我希望 Backbone.Model.save 将补丁请求发送到类似的 URLhttp://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" :“哈”}”。该服务得到了这一点,并且不知道如何处理“模型”属性。

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

更新:我之前的两个选项不起作用的原因在 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

看起来我正在寻找的processDatajQuery.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 回答