2013-10-08 42 views
1

如何设置Backbone集合以始终在所有请求中发送“application/json”内容类型?设置主干集合的默认内容类型

码我曾尝试:

myCollection = Backbone.Collection.extend({ 
    headers: {"Content-Type": 'application/json'}, 
    url: '/foo' 
}); 

和:

myCollection = Backbone.Collection.extend({ 
    contentType: 'application/json', 
    url: '/foo' 
}); 
然而

fetch()有没有内容类型发送?

回答

2

如果你想这样做,全球范围内为所有的骨干模型和集合,那么你可以提供自己的Backbone.ajax功能:如果你想使用自定义的AJAX功能

AJAXBackbone.ajax = function(request) { ... };

,或者您的端点不支持API,因此您需要调整内容,您可以通过设置Backbone.ajax来实现。

事情是这样的:

​​

_.defaults调用将使request一个副本contentType总是被设置为'application/json',如果你不复制request你最终会更改数据,你不要不一定拥有;改变request可能是无害的,但良好的习惯是良好的习惯。

+0

反正有没有这样做的集合不全球? –

+0

您可以重写[collection's'sync'](http://backbonejs.org/#Collection-sync)方法来始终强制使用'options.contentType ='application/json''。这个实现看起来和上面的'Backbone.ajax'几乎一样,只不过'sync'获得了三个参数,第三个参数是(可选的)'options'。 –

+0

有趣,好。我发现它奇怪的Backbone可以让你设置URL和东西作为选项,但不要求选项。谢谢! –

3

一种方式来做到这一点是压倒一切的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); 
} 

然后,如果你想定义Content-Type每个模型,你可以这样做:

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标题。