为骨干集合设置默认内容类型

时间:2013-10-08 04:59:57

标签: javascript jquery backbone.js

如何设置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 个答案:

答案 0 :(得分: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标题。

答案 1 :(得分:2)

如果您想对所有Backbone模型和集合进行全局操作,那么您可以提供自己的Backbone.ajax功能:

  

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

     

如果您想使用自定义AJAX功能,或者您的端点不支持 jQuery.ajax API并且需要调整内容,可以通过设置Backbone.ajax来实现

这样的事情:

Backbone.ajax = function(request) {
    request = _({ contentType: 'application/json' }).defaults(request);
    return Backbone.$.ajax.call(Backbone.$, request);
};

_.defaults来电将request的副本contentType始终设置为'application/json',如果您不复制request,您将结束更改您不一定拥有的数据;改变request可能是无害的,但良好的习惯是良好的习惯。