1

我将如何设置 Backbone 集合以始终在所有请求中发送“应用程序/json”的内容类型?

我试过的代码:

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

和:

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

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

4

2 回答 2

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

于 2013-10-08T10:37:37.007 回答
2

如果您想为所有 Backbone 模型和集合全局执行此操作,那么您可以提供自己的Backbone.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'requestrequest

于 2013-10-08T05:39:16.423 回答