使用AngularJs和UI-Router进行身份验证

时间:2015-02-13 06:08:39

标签: javascript angularjs angular-ui-router

我正在尝试为我的应用程序编写一个身份验证模块,遵循在线教程中的示例。

使用console.log,它可以正常工作。如果我使用$state.go(),我将获得无限循环,这会导致超出最大调用堆栈大小。

我的错误在哪里?

var myApp = angular.module('myApp', []);

myApp.run(['$rootScope', '$state', '$stateParams', function ($rootScope, $state) {

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

        var learner = toState.data.isLoggedIn && toState.data.role == 'learner';
        var trainer = toState.data.isLoggedIn && toState.data.role == 'trainer';
        var guest = !toState.data.isLoggedIn && toState.data.role == 'guest';

        if (learner) {
            console.log('learner');
        }
        else if (trainer) {
            console.log('trainer');
        }
        else {
            $state.go('home');
            event.preventDefault();
        }
    });
}]);

2 个答案:

答案 0 :(得分:0)

这可能与ui-router中的已知问题有关,因为角度为1.3.4左右。请参阅此处获取解决方法:https://github.com/angular-ui/ui-router/issues/600

我也有这个问题,并且可以通过使用.otherwise的另一个版本来修复它,它需要一个函数:

替换:

$urlRouterProvider.otherwise("/home"); 

with:

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

答案 1 :(得分:0)

如果toState ===' home'

,请尝试使用if子句排除操作
var myApp = angular.module('myApp', []);

myApp.run(['$rootScope', '$state', '$stateParams', function ($rootScope, $state) {

$rootScope.$on('$stateChangeStart', function (event, toState) {
    if(toState.name === 'home'){
        return;
    }
    var learner = toState.data.isLoggedIn && toState.data.role == 'learner';
    var trainer = toState.data.isLoggedIn && toState.data.role == 'trainer';
    var guest = !toState.data.isLoggedIn && toState.data.role == 'guest';

    if (learner) {
        console.log('learner');
    }
    else if (trainer) {
        console.log('trainer');
    }
    else {
        $state.go('home');
        event.preventDefault();
    }
});

}]);