angularjs $ state和$ rootScope。$ on($ stateChangeStart)问题

时间:2015-09-20 14:08:50

标签: javascript angularjs angular-ui-router state

我经历了多个问题,但没有找到解决方案。

我遇到状态处理问题。

$urlRouterProvider.otherwise( function($injector, $location) {
    var $state = $injector.get("$state");
    $state.go("cover");
});

$stateProvider
    .state('auth', {
        url: '/auth',
        templateUrl: '../views/authView.html',
        controller: 'AuthController as auth'
    })
    .state('users', {
        url: '/users',
        templateUrl: '../views/userView.html',
        controller: 'UserController as user'
    })
....

这就是我的应用程序中的路由工作方式。

app.run(function($rootScope, $state, $location) {
    $rootScope.$on('$stateChangeStart', function(event, toState, fromState) {

        //ERROR IS IN THIS BLOCK
        if($rootScope.authenticated && $rootScope.onboard == 0) {

            //event.preventDefault();

            $state.transitionTo("onboard", null, {notify:false});
            $state.go('onboard');
        }
...

每次我更改路线时,该块会触发数百次,但我希望它只是检查用户是否经过身份验证并完成了某些表单,或者是否只是重定向到表单本身。

我尝试过preventDefault()的不同方式;或没有,同样的问题。

1 个答案:

答案 0 :(得分:5)

首先,我们应该总是尝试检查,如果用户尚未将(之前被重定向)转到状态 'onboard' 。如果是,请停止任何其他处理(只需return)。

$rootScope.$on('$stateChangeStart', function(event, toState, fromState) {

    // in case, that TO state is the one we want to redirect
    // get out of here   
    if(toState.name === "onboard"){
       return;
    }

    if($rootScope.authenticated && $rootScope.onboard == 0) {

        // this should not be commented
        //event.preventDefault();
        // because here we must stop current flow.. .
        event.preventDefault();

        $state.transitionTo("onboard", null, {notify:false});
        $state.go('onboard');
    }
 ...

检查angularjs ui-router generates infinite loop