Dep*_*sio 5 javascript ajax backbone.js
我在正确形成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
Run Code Online (Sandbox Code Playgroud)
我也尝试过其他一些选择:
model.save object,
patch: true
emulateJSON: true
Run Code Online (Sandbox Code Playgroud)
这将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"
Run Code Online (Sandbox Code Playgroud)
这只是编码object为字符串和东西options.data.同样,该服务不知道如何处理它.
关于如何使其符合我的服务规范的任何其他想法?我可以自己做ajax调用并自己更新模型(以及它所属的集合),但我真的不愿意这样做.对我有用的ajax请求是:
$.ajax
url: "http://server/path/to/service"
type: "PATCH"
data: object
Run Code Online (Sandbox Code Playgroud)
更新:我的两个早期选项不起作用的原因在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} : {};
}
Run Code Online (Sandbox Code Playgroud)
看着这个,我想也许如果我将对象填入对象options.data并发送到空属性中,也许它可以工作:
model.save {},
patch: true
data: object
Run Code Online (Sandbox Code Playgroud)
显然,这试图修补一个选项"[object Object]".我想它确实是对象的字符串化...某处...但这可能接近正确的答案?
看来我正在寻找的是processData的选项jQuery.ajax。Backbone.sync默认情况下执行以下操作:
// Don't process data on a non-GET request.
if (params.type !== 'GET' && !options.emulateJSON) {
params.processData = false;
}
Run Code Online (Sandbox Code Playgroud)
因此,它没有为我将对象处理为 URL 参数。(jQuery API)
所以,一段有效的代码是:
model.save {},
patch: true
data: object
processData: true
Run Code Online (Sandbox Code Playgroud)
事实上,我可能总体上没有正确使用 Backbone.Model...但是,至少它正在工作。:P
| 归档时间: |
|
| 查看次数: |
2944 次 |
| 最近记录: |