backbone.js ajax请求的全局错误处理程序

Pla*_*bit 36 javascript rest backbone.js

有没有办法为backbone.js执行的ajax请求绑定一个错误处理程序?

我的情况:我可以随时获得401(未经授权),所以我需要显示登录弹出窗口.

Bil*_*uer 25

发生错误时,Backbone的同步会触发"错误"事件.因此,您可以采用的一种方法是扩展Backbone的Model和Collection对象,以添加这些附加错误检查.它看起来像这样:

ErrorHandlingModel = Backbone.Model.extend({

    initialize: function(attributes, options) {
        options || (options = {});
        this.bind("error", this.defaultErrorHandler);
        this.init && this.init(attributes, options);
    },

    defaultErrorHandler: function(model, error) {
        if (error.status == 401 || error.status == 403) {
            // trigger event or route to login here.
        }
    }

});

OtherModel = ErrorHandlingModel.extend({
});
Run Code Online (Sandbox Code Playgroud)

你会为Collection对象做类似的事情.我没有测试过上面的内容,但认为它非常接近.显然,你会选择更好的类名.init方法只是让子类有机会进行自己的初始化.

  • 一个模型真的应该负责处理401 Unauthorized吗? (4认同)

Jul*_*ien 24

直接使用jQuery.

$(document).ajaxError(function (e, xhr, options) {
  // do your stuff
});
Run Code Online (Sandbox Code Playgroud)

你可以在rails for rails中为CSRF做同样的事情(使用ajaxSend).

您可以在这里阅读更多内容:http://api.jquery.com/jQuery.ajax#advanced-options

  • 请注意,此回调将针对所有jQuery ajax错误执行,而不仅仅是与骨干请求相关的错误.页面中可能有其他库通过jquery发出ajax请求,在这些情况下你可能不希望回调. (7认同)
  • 如果fetch,sync,create方法具有作为选项提供的错误回调,则使用全局ajaxError回调的这种方法不适用于Backbone模型/集合. (3认同)
  • -1这是jquery ajax请求的全局错误处理程序,而不是主干.它实际上可能使用其他同步通道. (2认同)

Vyt*_*kus 15

我发现的可能是Backbone中"最正确的方式":

var GeneralErrorView = Backbone.View.extend({
  events: {
    'ajaxError': 'handleAjaxError'
  },
  handleAjaxError: function (event, request, settings, thrownError) {
    //...handling goes here
  }
});

this.view = GeneralErrorView({el: document});
Run Code Online (Sandbox Code Playgroud)

您可以在不扩展模型或集合的情况下放置任何错误处理逻辑.在处理程序中使用Backbone.Events并将消息传递给其他错误处理程序或类似的东西.


Hen*_*son 10

您可以通过jQuery .ajaxSetup方法处理此问题.我们有一个相同的情况(骨干应用程序,可能随时得到401错误),我们通过在我们的应用程序的入口点使用jQuery的ajaxSetup来处理它:

var appView = new AppView(options);

$.ajaxSetup({
    cache: false,
    statusCode: {
        401: function () {
            appView.signIn();
        }
    }
});

appView.render();

Backbone.history.start({ root: config.rootUrl, pushState: true });
Run Code Online (Sandbox Code Playgroud)

此方法提供全局错误处理,而无需扩展Backbone基类.