2015-10-20 96 views
2

我得到这个代码无限循环无限循环:角UI路由器时urlRouteProvider.otherwise设置

$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' 
    }) 
    ... 
} 

现在我当用户进入站点时获得无限的摘要循环并且必须被认证。 它是这样的:

  1. 用户输入的地址,即:http://localhost
  2. 默认路由(否则)火灾和reddirects用户http://localhost/#/main
  3. $ OnStateChangeStart火灾(为app.main)并测试用户是否已登录,如果不是,则阻止默认事件结束重定向到'app.login';
  4. $ OnstateChangeStart火灾(为app.login)和测试,如果toState.name是app.login'如果是这样,那么没有必要如此重定向恢复。
  5. 我不知道为什么,但然后$ OnStateChangeStart再次发射,但为app.main。 一遍又一遍地结束它。

请帮忙。

+0

嗨,我不久前遇到过类似的问题,我不得不将其他方法的声明更改为如何在此SO帖子的回复中(让我知道是否有帮助):http:// stackoverflow。 com/questions/26181141/angularjs-ui-router-otherwise-to-state-instead-of-url –

+0

看来这是答案。将再测试一下,然后接受。 – Luka

回答

12

otherwise()方法声明更改为状态名称转换,而不是您当前使用的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'); 

我不是非常的角经历,所以我不知道为什么。这解决了它,所以如果有人可以详细说明请做!

更新

在此SO post接受的答案似乎提供为什么出现这种情况了很好的解释。

+0

这并不能解决我的问题 – Pencilcheck

+0

对不起,它没有帮助,也许其他地方的代码是为你造成这个错误。如果您还没有找到解决方案,我会建议创建一个包括相关代码的新问题,以便人们可以帮助您调试/修复它 –

+0

帮助,谢谢! – Rantiev