Angular ui router - 重定向根本不起作用

Rut*_*rde 7 javascript url-routing angularjs angular-ui-router

我正在使用ui.router我的Angular应用程序进行路由.有一个典型的登录方案,如果他没有登录,我将用户重定向到登录URL.如果没有ui.router库,这可以使用$ routeChangeStart事件结合使用$location.path.现在,我正在使用这个$stateChangeStart事件$state.go,并且没有任何效果!它还将我的浏览器发送到无限循环.我从其他来源读到这是一个已知的错误,并没有一个建议的解决方案适合我.此外,$location.path也不会重定向到登录页面.

这就是我配置路径的方式:

 .config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) {
    $stateProvider
        .state('main', {
            url: '/',
            templateUrl: 'views/main.html',
            controller: 'MainCtrl'
        })
        .state('about', {
            url: '/about',
            templateUrl: 'views/about.html',
            controller: 'AboutCtrl'
        })
        .state('login', {
            url: '/login',
            templateUrl: 'views/loginform.html',
            controller: 'LoginCtrl'
        });
    $urlRouterProvider.otherwise("/");
}])
Run Code Online (Sandbox Code Playgroud)

我的run方法:

.run(['$state', '$rootScope', '$location', function($state, $rootScope, $location) {
    //Check when routing starts
    //event, next, current
    $rootScope.$on( '$stateChangeStart', function(e, toState, toParams, fromState, fromParams) {
        //Redirect to login if the user is not logged in
        if (!isUserLoggedIn) {

            //Some suggestion
            //e.preventDefault();
            console.log('Not logged in');

            //Infinite loop, kills my browser!
            $state.go('login');
            $state.transitionTo('login');

            //Some suggestion
            $state.go('login', { url: '/login'});

            //Doesn't work
            $location.path('/login');

            //$location.path( $state.href('login');
            console.log('Redirected');
        }
    });
Run Code Online (Sandbox Code Playgroud)

Rad*_*ler 8

如果状态TO已经是"登录",我们在这里需要的是不重定向.

只是起草了一个调整

$rootScope.$on( '$stateChangeStart', function(e, toState  , toParams
                                               , fromState, fromParams) {

    var isLogin = toState.name === "login";

    if(isLogin){

       return; // no need to redirect anymore 
    }
    ...
Run Code Online (Sandbox Code Playgroud)

而且,我们应该打电话$state.go('login');event.preventDefault();

 ...
 // also prevent default on redirect
 $state.go('login');
 event.preventDefault(); 
 ...
Run Code Online (Sandbox Code Playgroud)

请检查此问答如何修复'超出最大调用堆栈大小'AngularJS 和具有类似解决方案的plunker