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

发布于 2024-11-09 22:02:46 字数 91 浏览 0 评论 0原文

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

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

Is there way to bind one error handler for ajax requests that performs by backbone.js?

My situation: I can get 401 (Unauthorized) at any time, so I need to show login popup.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

A君 2024-11-16 22:02:46

当发生错误时,Backbone 的同步会触发“错误”事件。因此,您可以采取的一种方法是扩展 Backbone 的模型和集合对象以添加这些附加错误检查。它看起来像这样:

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({
});

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

Backbone's sync triggers an 'error' event when errors occur. So one approach you could take is to extend Backbone's Model and Collection objects to add these add-on error checks. It would look something like this:

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({
});

and you would do something similar for the Collection object. I haven't tested the above, but think its pretty close. Obviously, you would choose better class names. The init method just enables subclasses to get a chance to do their own initialization.

随梦而飞# 2024-11-16 22:02:46

为此直接使用 jQuery。

$(document).ajaxError(function (e, xhr, options) {
  // do your stuff
});

例如,您可以对 Rails 中的 CSRF 执行相同的操作(使用 ajaxSend)。

您可以在这里阅读更多信息: http://api.jquery.com/jQuery.ajax#advanced -选项

Use jQuery directly for this.

$(document).ajaxError(function (e, xhr, options) {
  // do your stuff
});

You can do the same thing for CSRF in rails for exemple (using ajaxSend).

You can read more here: http://api.jquery.com/jQuery.ajax#advanced-options

泅渡 2024-11-16 22:02:46

我发现的可能是 Backbone 中“最正确的方法”:

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

this.view = GeneralErrorView({el: document});

您可以放置​​任何错误处理逻辑,而无需扩展模型或集合。在处理程序中使用 Backbone.Events 并将消息传输到其他错误处理程序或类似的东西。

What I found is possibly the "most right way" in Backbone:

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

this.view = GeneralErrorView({el: document});

You can put any error handling logic without extending Models or Collections. Make use of Backbone.Events inside handler and transmit messages to other error handlers or something like that.

久隐师 2024-11-16 22:02:46

您可以通过 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 });

这种方法提供全局错误处理,而无需扩展 Backbone 基类。

You can handle this via the jQuery .ajaxSetup method. We have an identical situation (backbone app which may get a 401 error at any time) and we handle it by using jQuery's ajaxSetup in the entry point of our app:

var appView = new AppView(options);

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

appView.render();

Backbone.history.start({ root: config.rootUrl, pushState: true });

This approach gives global error handling without the need to extend the Backbone base classes.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文