Angularjs 设置urlRouteProvider.Others时的角度ui路由器无限循环

Angularjs 设置urlRouteProvider.Others时的角度ui路由器无限循环,angularjs,angular-ui-router,angularjs-digest,Angularjs,Angular Ui Router,Angularjs Digest,我得到了这个代码的无限循环: $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) { var isLoggedIn = (authService.authentication && authService.authentication.isAuth); if (isLoggedIn) {

我得到了这个代码的无限循环:

    $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
        var isLoggedIn = (authService.authentication && authService.authentication.isAuth);
        if (isLoggedIn) {
            //if user is logged and tries to access login page, prevent it
            if (toState.name === 'app.login') {
                event.preventDefault();
                return fromState;
            } 
        } else {
            if (toState.name !== 'app.login') {
                event.preventDefault();
                $state.go('app.login');
                return;
            }
        }
    });
我还有这套:

function config($stateProvider, $urlRouterProvider, $ocLazyLoadProvider) {
    $urlRouterProvider.otherwise('/main');

    $stateProvider
    .state('app', {
        abstract: true,
        url: '',
        controller: 'mainCtrl',
        controllerAs: 'mainCtrl',
        template:'<div ui-view></div>'      
    })
    .state('app.login', {
        url: '/logn'
        controller: 'loginCtrl',
        controllerAs: 'loginCtrl',
        templateUrl: 'app/security/login.html'
    })
    .state('app.main', {
        url: '/main'
        controller: 'mainCtrl',
        controllerAs: 'mainCtrl',
        templateUrl: 'app/main.html'
    })
    ...
}
函数配置($stateProvider、$urlRouterProvider、$ocLazyLoadProvider){
$urlRouterProvider。否则('/main');
$stateProvider
.state('应用程序'{
摘要:没错,
url:“”,
控制器:“mainCtrl”,
controllerAs:'mainCtrl',
模板:“”
})
.state('app.login'{
url:“/logn”
控制器:“loginCtrl”,
controllerAs:'loginCtrl',
templateUrl:'app/security/login.html'
})
.state('app.main'{
url:“/main”
控制器:“mainCtrl”,
controllerAs:'mainCtrl',
templateUrl:'app/main.html'
})
...
}
现在,当用户进入站点并且必须经过身份验证时,我得到了无限摘要循环。 事情是这样的:

  • 用户输入地址,即:
  • 默认路由(否则)激发并重新引导用户
  • $OnStateChangeStart激发(对于app.main)并测试用户是否已登录,如果未登录,则阻止默认事件结束重定向到“app.login
  • $OnstateChangeStart激发(对于app.login)并测试toState.name是否为app.login'如果是,则无需重定向so返回
  • 我不知道为什么,但是$OnStateChangeStart再次启动,但是对于app.main。 结束它一遍又一遍地被剪掉
  • 请提供帮助。

    否则()
    方法声明更改为状态名称转换,而不是当前使用的URL转换。当我遇到这个问题时,它为我解决了这个问题

    举个例子:

    $urlRouterProvider.otherwise(function($injector, $location){
      $injector.invoke(['$state', function($state) {
        $state.go('app.main');
      }]);
    }); 
    
    获取
    $state
    并执行
    $state.go
    的另一种方法是

    var $state = $injector.get('$state');
    $state.go('app.main');
    
    我不是很有经验的角度,所以我不知道为什么这解决了它,所以如果有人可以详细说明,请做

    更新


    这篇文章中被接受的答案似乎很好地解释了为什么会发生这种情况。

    嘿,不久前我遇到了类似的问题,我不得不将我对其他方法的声明更改为这篇文章的答案(如果有帮助,请告诉我):这似乎就是答案。将进行更多测试,然后接受。很抱歉,这没有帮助,可能是其他地方的一些代码导致了此错误。如果您还没有找到解决方案,我建议您创建一个包含相关代码的新问题,以便人们可以帮助您调试/修复它。谢谢!