javascript - Angular ui路由器 - 重定向根本不起作用

标签 javascript angularjs angular-ui-router url-routing

我正在使用 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 方法:

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

最佳答案

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

只是草拟的调整

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

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

    if(isLogin){

       return; // no need to redirect anymore 
    }
    ...

此外,我们应该调用 $state.go('login');event.preventDefault();

 ...
 // also prevent default on redirect
 $state.go('login');
 event.preventDefault(); 
 ...

请查看此问答How can I fix 'Maximum call stack size exceeded' AngularJSa plunker用类似的解决方案

关于javascript - Angular ui路由器 - 重定向根本不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26135382/

相关文章:

javascript - setInterval() 方法的行为很奇怪

javascript - 如何编辑源自超链接(<a href> 标记)的 HTTP GET 请求的授权 header

javascript - 有没有办法在 Angular 中延迟加载 CSS 文件?

javascript - Angular UI-Router 中的嵌套 View 在状态更改期间滞后

angularjs - 如何从服务器(node.js)检索 mongodb 数据到我的 AngularJS 路由

Angular 嵌套路由器 socket 子项在路由器动画完成之前消失

javascript - 使用 Jquery 的图表

javascript - 使用 CSS 样式和上传按钮的功能

javascript - 为什么我的函数在延迟后不删除元素?

angularjs - angular ui-route state parent 和解析(嵌套解析)