Angularjs ui 路由器。如何重定向到登录页面

标签 angularjs config state angular-ui-router resolve

我有 4 个状态:dashboarddahboard.maindashboard.minorlogin。 仪表板是抽象的,它是 .minor 和 .main 状态的父状态。 下面是我的代码:

.state('dashboard', {
        url: "/dashboard",
        abstract: true,
        templateUrl: "views/dashboard.html",
        resolve: {
            auth: function ($q, authenticationSvc) {
                var userInfo = authenticationSvc.getUserInfo();
                if (userInfo) {
                    return $q.when(userInfo);
                } else {
                    return $q.reject({ authenticated: false });
                }
            }
        },
        controller: "DashboardCtrl",
        data: { pageTitle: 'Example view' }
    })
    .state('dashboard.main', {
        url: "",
        templateUrl: "views/main.html",
        controller: "DashboardCtrl",
        data: { pageTitle: 'Main view' }
    })

正如您在仪表板状态中看到的,我有解析选项。通过此,如果用户未获得授权,我想将用户重定向到登录页面。因此,我使用特殊的 authenticationSvc 服务:

.factory("authenticationSvc", ["$http", "$q", "$window", function ($http, $q, $window) {
    var userInfo;

    function login(email, password) {
        var deferred = $q.defer();

        $http.post("/api/login", { email: email, password: password })
            .then(function (result) {
                if(result.data.error == 0) {
                    userInfo = {
                        accessToken: result.data.accessToken
                    };
                    $window.sessionStorage["userInfo"] = JSON.stringify(userInfo);
                    deferred.resolve(userInfo);
                }
                else {
                    deferred.reject(error);
                }
            }, function (error) {
                deferred.reject(error);
            });

        return deferred.promise;
    }
    function getUserInfo() {
        return userInfo;
    }
    return {
        login: login,
        logout: logout,
        getUserInfo: getUserInfo
    };
}]);

我检查配置中的身份验证值:

.run(function($rootScope, $location, $state) {
    $rootScope.$state = $state;
    $rootScope.$on("routeChangeSuccess", function(userInfo) {
        consol.log(userInfo);
    });
    $rootScope.$on("routeChangeError", function(event, current, previous, eventObj) {
        if(eventObj.authenticated === false) {
            $state.go('login');
        }
    });
});

但不幸的是,当我转到网站根目录或仪表板状态时,我得到一个空页面。这段代码有什么问题?谢谢!

最佳答案

重点是,如果不需要,则不要重定向 === 如果已经重定向到预期状态。有a working plunker具有类似的解决方案

.run(function($rootScope, $location, $state, authenticationSvc) {


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

        var isLogin = toState.name === "login";
        if(isLogin){
           return; // no need to redirect 
        }

        // now, redirect only not authenticated

        var userInfo = authenticationSvc.getUserInfo();

        if(userInfo.authenticated === false) {
            e.preventDefault(); // stop current execution
            $state.go('login'); // go to login
        }
    });
});

检查这些类似的解释:

关于Angularjs ui 路由器。如何重定向到登录页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27212182/

相关文章:

javascript - 为什么我的 setState 函数会覆盖当前状态?

javascript - 使用 Angular UI 路由器从父状态向子状态共享数据

javascript - 使用 MEAN.js 上传照片

ios - App Store 图片未显示在 Xcode 中

android - Phongap config.xml 和 Cordova config.xml 之间有区别吗?

java - Spring解析属性文件位置需要解析那些属性

javascript - 更改现有对象的状态

javascript - Angular 插入数组对象

javascript - AngularJs - 将 ng-controller 与 ng-include 一起使用

vim - 在 Vim 中修改 Ctrl-G