Javascript 为主干集合设置默认内容类型
如何设置主干集合,以便在所有请求中始终发送“application/json”的内容类型 我尝试过的代码:Javascript 为主干集合设置默认内容类型,javascript,jquery,backbone.js,Javascript,Jquery,Backbone.js,如何设置主干集合,以便在所有请求中始终发送“application/json”的内容类型 我尝试过的代码: myCollection = Backbone.Collection.extend({ headers: {"Content-Type": 'application/json'}, url: '/foo' }); 以及: 但是,在fetch()上,没有发送任何内容类型?如果要对所有主干模型和集合进行全局操作,则可以提供自己的功能: ajaxBackbone.ajax=函数(请求)
myCollection = Backbone.Collection.extend({
headers: {"Content-Type": 'application/json'},
url: '/foo'
});
以及:
但是,在
fetch()
上,没有发送任何内容类型?如果要对所有主干模型和集合进行全局操作,则可以提供自己的功能:
ajaxBackbone.ajax=函数(请求){…}代码>
如果您想使用自定义AJAX函数,或者您的端点不支持jQuery.AJAX API,并且您需要调整,那么可以通过设置Backbone.AJAX
来实现
大概是这样的:
Backbone.ajax = function(request) {
request = _({ contentType: 'application/json' }).defaults(request);
return Backbone.$.ajax.call(Backbone.$, request);
};
调用将复制请求
,而contentType
始终设置为'application/json'
,如果您不复制请求
,您将最终更改不必拥有的数据;更改请求
可能是无害的,但好习惯就是好习惯。如果您想在全球范围内对所有主干型号和系列进行更改,那么您可以提供自己的功能:
ajaxBackbone.ajax=函数(请求){…}代码>
如果您想使用自定义AJAX函数,或者您的端点不支持jQuery.AJAX API,并且您需要调整,那么可以通过设置Backbone.AJAX
来实现
大概是这样的:
Backbone.ajax = function(request) {
request = _({ contentType: 'application/json' }).defaults(request);
return Backbone.$.ajax.call(Backbone.$, request);
};
调用将复制请求
,而contentType
始终设置为'application/json'
,如果您不复制请求
,您将最终更改不必拥有的数据;改变请求可能无害,但好习惯就是好习惯。一种方法是覆盖主干网。sync
var _sync = Backbone.sync;
Backbone.sync = function(method, model, options) {
options.beforeSend = function(xhr) {
xhr.setRequestHeader('Content-Type': 'application/json');
};
_sync.apply(Backbone, arguments);
}
然后,如果您想定义每个模型的内容类型
,可以执行以下操作:
var _sync = Backbone.sync;
Backbone.sync = function(method, model, options) {
options.beforeSend = function(xhr) {
var contentType = model.contentType || null;
// var contentType = model.contentType || 'application/json'; // default to json
if(contentType) {
xhr.setRequestHeader('Content-Type': contentType);
}
};
_sync.apply(Backbone, arguments);
}
不过,如果您正在寻找一种方法来告诉服务器在fetch()
调用时返回JSON,那么您真正需要的是Accept
头。一种方法是覆盖Backbone.sync
var _sync = Backbone.sync;
Backbone.sync = function(method, model, options) {
options.beforeSend = function(xhr) {
xhr.setRequestHeader('Content-Type': 'application/json');
};
_sync.apply(Backbone, arguments);
}
然后,如果您想定义每个模型的内容类型
,可以执行以下操作:
var _sync = Backbone.sync;
Backbone.sync = function(method, model, options) {
options.beforeSend = function(xhr) {
var contentType = model.contentType || null;
// var contentType = model.contentType || 'application/json'; // default to json
if(contentType) {
xhr.setRequestHeader('Content-Type': contentType);
}
};
_sync.apply(Backbone, arguments);
}
尽管如此,如果您正在寻找一种方法来告诉服务器在fetch()
调用时返回JSON,那么您真正需要的是Accept
头。对于非全局性的集合,是否仍有这样做的方法?您可以重写该方法以始终强制options.contentType='application/JSON'
。该实现看起来与上面的主干.ajax
几乎相同,只是sync
获取三个参数,其中(可选)选项作为第三个参数。很有趣,ok。我觉得这很奇怪,主干网可以让你设置URL和内容作为一个选项,而不是请求选项。谢谢我猜以前没有人需要它。如果您查看Backbone.sync
源代码,您将看到除了(AFAIK)GET请求(除非您已启用emulateHTTP
)之外,Backbone将为所有内容设置contentType:'application/json'
).@w-van-kuipers您的编辑被拒绝,因为语法为。是否仍要对非全局集合执行此操作?您可以重写此方法以始终强制options.contentType='application/json'
。该实现看起来与上面的主干.ajax
几乎相同,只是sync
获取三个参数,其中(可选)选项作为第三个参数。很有趣,ok。我觉得这很奇怪,主干网可以让你设置URL和内容作为一个选项,而不是请求选项。谢谢我猜以前没有人需要它。如果您查看Backbone.sync
源代码,您将看到Backbone将为除GET请求(AFAIK)之外的所有内容设置contentType:“application/json”
。@w-van-kuipers您的编辑被拒绝,因为语法错误。