Javascript 阻止用户在登录后导航到某些URL-angular ui router

Javascript 阻止用户在登录后导航到某些URL-angular ui router,javascript,angularjs,angular-ui-router,Javascript,Angularjs,Angular Ui Router,目前,我正在我的应用程序中使用angularjs开发一个示例管理应用程序。我使用了ui-router而不是ngRoute来定义URL。在我的配置函数中,状态定义如下 sampleModule.config(['$stateProvider','$urlRouterProvider',function ($stateProvider,$urlRouterProvider) { $urlRouterProvider.otherwise('login'); $stateProvide

目前,我正在我的应用程序中使用angularjs开发一个示例管理应用程序。我使用了ui-router而不是ngRoute来定义URL。在我的配置函数中,状态定义如下

sampleModule.config(['$stateProvider','$urlRouterProvider',function ($stateProvider,$urlRouterProvider) {

    $urlRouterProvider.otherwise('login');
    $stateProvider
        .state('login',{
            url:'/login',
            templateUrl: 'views/html/login.html',
            controller: 'authCtrl'
        }).state('main', {
            url:'/main',
            templateUrl: 'views/html/main.html',
            controller: 'adminViewCtrl'
        });
}]);
在应用程序的运行状态下,我将用户重定向到各自的视图,如下所示

sampleModule.run(function ($rootScope, AuthService, $state) {

    $rootScope.$on("$stateChangeStart", function (event) {
            if (AuthService.isAuthenticated()) {
                event.preventDefault();
                $state.go('main');
            } else {
                event.preventDefault();
                $state.go('login');
            }
    });
});
但我面临的问题是应用程序出现以下异常,并且在URL更改时有时会崩溃

RangeError:超出了最大调用堆栈大小

我将调试点放在应用程序的运行功能上,然后 并注意到出现错误是因为if(AuthService.isAuthenticated()){条件在无限循环中执行

下面是chrome开发者工具中错误的图片

我对这里发生的事情感到困惑,我在谷歌上搜索了几个小时,没有找到一个直接的答案,我甚至试着把event.preventDefault()作为我看到的一些建议,但这无助于解决问题


我想知道我在这里犯了什么错误?在登录到应用程序后,有没有更好的方法限制用户访问登录页面或应用程序的其他部分?

这里的问题是,您不断地将用户重定向到相同的状态。下面是发生的情况:用户进入某个状态,
$stateChangeStart
is触发后,您再次将用户重定向到其他状态,然后再次触发
$stateChangeStart
,您检查身份验证并再次重定向,直到出现
RangeError
为止。您可能只需要在未经授权的情况下重定向用户,如果他已获得授权,请让他查看他正在查看的页面r

sampleModule.run(function ($rootScope, AuthService, $state) {

    $rootScope.$on("$stateChangeStart", function (event, toState) {
            if (!AuthService.isAuthenticated() && toState.name !== 'login') {
                $state.go('login');
            } else if(AuthService.isAuthenticated() && toState.name === 'login') {
                $state.go('main');
            } 
    });
});

在这里,您可以检查用户是否已授权,导航状态是否未登录(因为他已被重定向),然后检查它是否是他想要的登录页面,并重定向到
main

@domakas-非常感谢您的快速回答,它帮助解决了我的问题:)