8

在我的基于 Backbone.js 的应用程序中,我正在与我的 API 交谈,该 API 以 401 响应,以防在没有或使用无效身份验证令牌的情况下发出底层请求。每次收到 401 时,我想通过导航到 #login 页面来检测它。

为了获取 401,我成功地包装了 Backbone.sync,但那时我有点卡住了。我在这里尝试了几种策略:

  1. throw 'unauthorized'在 Backbone::sync 中向下并尝试在我的路由器中获取。失败:“未获授权”

  2. 尝试#.navigate '#login'在 Backbone::sync 中关闭,这不仅看起来很奇怪,而且伴随着我的应用程序基于 AMD/require.js 的问题,我不能简单地在我的包装sync函数中访问我的 Backbone.Router 实例。

到目前为止,我看到的唯一解决方案是创建一个“全局可用”的缓存对象,它获取对我的路由器实例的引用,然后将其define作为依赖项放入需要的地方。那个缓存对象必须是一个单例并且破坏了我的整个“请禁止全局和禁止命名空间”策略。

我有点卡在这里。谁能指出我对这个常见问题的更干净的解决方案?

4

2 回答 2

9

您可以在 ajaxError 中进行重定向:

$.ajaxError(function (event, xhr) {
            if (xhr.status == 401)
                window.location = '#login';
        });

如果一切设置正确,则无需手动访问路由器实例。转到该 url 应该触发与其关联的路由功能。

于 2012-11-12T11:53:43.017 回答
3

对于使用 jQuery 1.8 或更高版本的用户,语法已更改:

$(document).ajaxError(function (event, xhr) {
        if (xhr.status == 401)
            window.location = '#login';
    });

有关详细信息,请参阅jQuery 手册

于 2015-03-02T00:46:13.703 回答