2012-11-12 34 views
8

在我的基于Backbone.js的应用程序中,我正在与我的API交谈,如果底层请求没有或使用无效的身份验证令牌,则会与401响应。我想通过导航到#login页面来检测,每次收到401。如何在基于Backbone.js的应用程序中干净地获取401

要取回401我成功地包装Backbone.sync,但在那一点上,我得到了一种卡住。我尝试了几种策略在这里:

  1. throw 'unauthorized'下来骨干::同步并尝试在我的路由器来弥补。 '未经授权'

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

我看到迄今唯一的解决办法是建立一个“全球可用的”缓存对象,即获得一个参考我的路由器实例,并又投入define因为需要它的依赖。该缓存对象必须是单例,并打破了我的整个'请不要全局名称空间'策略。

我有点卡在这里。任何人都可以指出我对这个常见问题的更清晰的解决方案吗?

回答

8

你可以做重定向在ajaxError:

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

如果一切正确设置你不需要手动访问路由器的实例。去那个URL应该触发与之相关的路由功能。

+0

Undestood。我可以做同样的window.location = ...同步我获取该响应。好主意。我认为一个干净的方法,我不得不使用路由器。但这听起来像是一个好的解决方案。谢谢Anrei – GeorgieF

3

对于使用jQuery 1.8或更大的那些,其语法已经改变:

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

详见jQuery manual

+0

在[doc](http://api.jquery.com/ajaxerror/)中提到它是从1.9开始的? –

相关问题