繁体   English   中英

将JSON编码为Backbone.Model.save的URL参数(patch = true)

[英]Encoding JSON to URL params for Backbone.Model.save (patch = true)

我在正确形成Backbone.Model.save调用方面遇到了一些麻烦。 我正在调用的Web服务使用URL参数,但我在Javascript中拥有的是更改字段的对象。 例如,我有对象{foo: 'bar', yar: 'har'} ,我希望Backbone.Model.save将补丁请求发送到http://server/path/to/service?foo=bar&yar=har这样的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

更新:我的两个早期选项不起作用的原因在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]”。 我想它确实是对象的字符串化...某处...但这可能接近正确的答案?

看起来我正在寻找的是jQuery.ajaxprocessData选项。 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM