我有一个需要授权的状态。我监听$stateChangeStart
事件,如果toState.data.protected
和用户未被授权,我调用e.preventDefault()
和$state.go('login')
。
当我在根url中打开应用程序时,我会自动重定向到受保护状态。这会导致10$digest循环,当我在根url中打开应用程序时,我最终处于登录状态,并自动重定向到受保护状态。
Uncaught Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!
请参阅以下链接:http://plnkr.co/edit/1voh7m?p=preview
我在angular 1.2.26的不同项目中成功地使用了类似的代码,没有任何错误。
示例代码angular 1.4.1, ui.router 0.2.15
:
//config block
$urlRouterProvider.otherwise('/main');
$stateProvider
.state('main', {
url: '/main',
templateUrl: 'main.html',
controller: 'MainController as main',
data: {'protected': true}
})
.state('login', {
url: '/login',
templateUrl: 'login.html',
controller: 'LoginController as login'
});
// in a run block
$rootScope.$on("$stateChangeStart", function (event, toState) {
if (!event.defaultPrevented && toState.data &&
toState.data.protected) {
// the user is not authorized, do not switch to state
event.preventDefault();
// go to login page
$state.go('login');
}
});
你知道循环的原因吗?
我想知道事情是否会这样发生:
- 拦截到main.submain状态的转换
- 开始转换到登录状态
- UI路由器获取第一次transotion被取消的信息
- UI路由器运行
$urlRouter.update()
并开始转换到main.submain
编辑:简化的状态配置。
这是UI.Router的问题-请参阅Github上的这个问题:https://github.com/angular-ui/ui-router/issues/600
基本上,如果您使用.otherwise('/main')
(@Grundy也指出了这一点(,那么当路径无法解析时,url将更改为/main
。在$locationChangeSuccess
之后,我的侦听器被调用,并且我使用event.preventDefault()
拒绝重定向。这会导致位置变回未知路径,从而导致再次使用回退路径。这导致了无限循环。解决方案是:
$urlRouterProvider.otherwise(function($injector) {
var $state = $injector.get('$state');
$state.go('main');
});
您可以声明一个用$injector
调用的函数,并且可以重定向到您的主状态(或404(,而无需来回更改位置。谢谢Github上的人,我应该在发布这个问题之前搜索一下。
工作冲击:http://plnkr.co/edit/eQXaIk