Javascript 将JSON编码为Backbone.Model.save的URL参数(patch=true)
我在正确建立主干网.Model.save呼叫时遇到一些问题。我调用的web服务使用URL参数,但我在Javascript中拥有的是一个更改字段的对象。例如,我有一个对象Javascript 将JSON编码为Backbone.Model.save的URL参数(patch=true),javascript,ajax,backbone.js,Javascript,Ajax,Backbone.js,我在正确建立主干网.Model.save呼叫时遇到一些问题。我调用的web服务使用URL参数,但我在Javascript中拥有的是一个更改字段的对象。例如,我有一个对象{foo:'bar',yar:'har'},我希望Backbone.Model.save向类似的URL发送补丁请求http://server/path/to/service?foo=bar&yar=har 听起来很简单,对吧?不管怎样,这给我带来了很多麻烦。以下是我到目前为止得到的结果(这不起作用;我也有成功/错误回调,但我认为这
{foo:'bar',yar:'har'}
,我希望Backbone.Model.save向类似的URL发送补丁请求http://server/path/to/service?foo=bar&yar=har
听起来很简单,对吧?不管怎样,这给我带来了很多麻烦。以下是我到目前为止得到的结果(这不起作用;我也有成功/错误回调,但我认为这些对问题并不重要):
我也尝试过其他一些选择:
model.save object,
patch: true
emulateJSON: true
这将contentType设置为“application/x-www-form-urlencoded”,这很好,但是Backbone.sync在ajax请求中发送的数据是:{model:{foo:“bar”,“yar:“har”}。服务得到了这一点,不知道如何处理“model”属性
model.save object,
patch: true
contentType: "application/x-www-form-urlencoded"
这只是将对象
编码为字符串,并将其填充到选项中。数据
。同样,服务不知道如何处理它
关于如何使其符合我的服务规范,还有其他想法吗?我可以自己调用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
显然,这试图修补一个选项“[对象对象]”。我猜它在某处对对象进行了字符串化…但这可能接近正确答案?看起来我要找的是
jQuery.ajax
主干网的processData
选项。默认情况下,sync执行以下操作:
// Don't process data on a non-GET request.
if (params.type !== 'GET' && !options.emulateJSON) {
params.processData = false;
}
因此,它没有为我将对象处理为URL参数
因此,一段有效的代码是:
model.save {},
patch: true
data: object
processData: true
事实上,我可能没有使用主干网。整体来说,模型是正确的……但是,至少它是有效的。:p
model.save {},
patch: true
data: object
processData: true