我正在创建一个连接到RESTful后端的骨干应用程序。当我在模型上调用save()时,它将发布数据作为字符串化JSON发送:
{"firstName":"first","lastName":"last","Email":"email@gmail.com"}
但是我的服务器希望它的格式为querystring:
firstName=first&lastName=last&Email=email@gmail.com
有没有办法让骨干以不同的方式发送它?
答案 0 :(得分:8)
Backbone不提供开箱即用的任何东西。
但很容易根据您的需要覆盖和定制它。
查看源代码: http://documentcloud.github.com/backbone/docs/backbone.html
并查看调用save
,它会在后台触发sync
来电。
所以你需要的是用自己的方式覆盖Backbone.sync
函数。
我会修改以下部分:
if (!options.data && model && (method == 'create' || method == 'update')) {
params.contentType = 'application/json';
params.data = JSON.stringify(model.toJSON());
}
与
if (!options.data && model && (method == 'create' || method == 'update')) {
params.contentType = 'application/json';
params.data = $.param(model); // <-- CHANGED
}
注意我正在使用jQuery param
如果您想使用自定义功能,请检查以下问题: Query-string encoding of a Javascript Object
<强> [更新] 强>
无需直接修改。使用您自己的函数'Backbone.sync'更好地覆盖它
检查Backbone存储库的“TODO”示例。它有一个覆盖Backbone.sync函数https://github.com/documentcloud/backbone/tree/master/examples
localStorage.js
文件
答案 1 :(得分:2)
我在工作中遇到了这个问题,Backbone.emulateJSON对我来说也不起作用。在一些帮助下,我能够想出这个解决方法。我们覆盖了Backbone.ajax函数并将contentType更改为“application / x-www-form-urlencoded”并使用$ .param来正确序列化数据。
Backbone.ajax = function() {
if(arguments[0].data && arguments[0].contentType == "application/json"){
arguments[0].data = $.param(JSON.parse(arguments[0].data));
arguments[0].contentType = "application/x-www-form-urlencoded";
}
return Backbone.$.ajax.apply(Backbone.$, arguments);
}
答案 2 :(得分:0)
也许这可以帮助你,尝试: http://backbonejs.org/#Sync-emulateJSON
答案 3 :(得分:0)
我是通过覆盖模型的同步功能来完成的:
var MyModel = Backbone.Model.extend({
"sync": function(method, model, options) {
if (method == "update" || method == "create") {
options = options ? _.clone(options) : {};
options['data'] = $.param(this['attributes']);
}
var arguments = [method, model, options];
return Backbone.sync.apply(this, arguments);
}
});
答案 4 :(得分:0)
我找到了解决方案,请参阅:
我用
Backbone.emulateJSON = true;
我写了“更新”案例:
options.url = "/user/"+Math.random(1, 1000);
options.type = "POST";
//.1/2 WORK
//options.data = (model instanceof Backbone.Model)?model.toJSON():{};
options.data = model.toJSON();
break;
答案 5 :(得分:0)
Backbone.sync使用jQuery.ajax函数,因此我们可以修改jqXHR或发送给服务器的数据(通过beforeSend)。
var oldSync = Backbone.Model.prototype.sync;
var SomeModel = Backbone.Model.extend({
url: 'test.json',
defaults: {
id: 1,
foo: 'test'
},
sync: function (method, model, options) {
// options are passed to the jQuery.ajax
_.extend(options, {
emulateHTTP: true,
emulateJSON: false,
beforeSend: function(xhr, settings) {
// settings.data is a body of our request.
if (_.isString(settings.data)) {
// settings.data is a JSON-string like '{"id":1, "foo":"test"}'
settings.data = Backbone.$.parseJSON(settings.data);
}
settings.data = Backbone.$.param(settings.data);
// settings.data is 'id=1&foo=test'
}
});
oldSync.apply(this, arguments);
}
});
var model = new SomeModel();
model.save();
实际上我们可以创建一个mixin! :)