angularJS服务注入运行块

时间:2016-04-04 11:34:53

标签: angularjs angular-ui-router angular-services

我有一个Angular(1.5)应用程序,带有我创建的身份验证服务(见下文)。

(function () {
    "use strict";

    angular
        .module("app.core")
        .service("mfAuth", mfAuth);

    /** @ngInject */
    function mfAuth(api, $rootScope, AUTH_EVENTS, $cookies) {

        var currentUser = { userName: "" };
        getSession();

        var setRememberMe = function (rememberme, userId) {
            if (rememberme && userId && userId > 0) {
                var date = new Date();
                date.setDate(date.getDate() + 30);
                $cookies.put('remember_me', userId, { expires: date });
            } else
                $cookies.remove('remember_me');
        };

        function changeUser(user) {
            var userProps = {
                displayName: user.displayName,
                ...
            };
            angular.extend(currentUser, userProps);
        }

        function isLoggedIn(user) {
            if (user === undefined) {
                user = currentUser;
            }
            return user && user.userId > 0;
        };

        function getSession(force) {
            var rememberme = $cookies.get('remember_me') !== undefined;
            if (rememberme || force) {
                var apiAuth = new api.Auth();
                apiAuth.$getSession(
                    null,
                    function(response) {
                        if (response.result !== undefined) {
                            changeUser(response.result);
                            $rootScope.$broadcast(AUTH_EVENTS.isAuthenticated);
                        } else {
                            changeUser({});
                            $rootScope.$broadcast(AUTH_EVENTS.notAuthenticated);
                        }
                    },
                    function(response) {
                        changeUser({});
                        $rootScope.$broadcast(AUTH_EVENTS.notAuthenticated);
                    }
                );
            } else {
                changeUser({});
                $rootScope.$broadcast(AUTH_EVENTS.notAuthenticated);
            }
        };

        function login(user, successCallback, errorCallback) {
            var apiAuth = new api.Auth();
            apiAuth.userName = user.userName;
            apiAuth.password = user.password;
            apiAuth.$login(
                null,
                function (response) {
                    getSession(true);
                    if (successCallback)
                        successCallback(response);
                    setRememberMe(user.rememberme, response.userId);
                },
                function (response) {
                    if (errorCallback)
                        errorCallback(response);
                }
            );
        };

        function logout(successCallback, errorCallback) {
            var apiAuth = new api.Auth();
            apiAuth.$logout(
                null,
                function (response) {
                    changeUser({});
                    if (successCallback)
                        successCallback();
                    setRememberMe(false, null);
                    $rootScope.$broadcast(AUTH_EVENTS.logoutSuccess);
                },
                function (response) {
                    if (errorCallback)
                        errorCallback(response);
                }
            );
        }

        return {
            isLoggedIn: isLoggedIn,
            login: login,
            logout: logout,
            user: currentUser
        };
    }
}());

我正在收听我的主runBlock上的广播......就这样......

(function () {
    'use strict';

    angular
        .module('app.core')
        .run(runBlock);

    /** @ngInject */
    function runBlock(msUtils, fuseGenerator, fuseConfig, $rootScope, AUTH_EVENTS, $state) {
        $rootScope.$on(AUTH_EVENTS.notAuthenticated, function (ev, reason) {
            if (!$state.is('app.auth_login')) {
                event.preventDefault();
                $state.go('app.auth_login');
            }
        });
        $rootScope.$on(AUTH_EVENTS.isAuthenticated, function (ev, reason) {
            if ($state.is('app.auth_login')) {
                event.preventDefault();
                $state.go('app.dashboard');
            }
        });
        $rootScope.$on(AUTH_EVENTS.logoutSuccess, function (ev, reason) {
            if (!$state.is('app.auth_login')) {
                event.preventDefault();
                $state.go('app.auth_login');
            }
        });
    }
})();

当服务注入登录控制器时,一切都按预期工作 - 服务被实例化,getSession()函数触发,应用程序确定用户是否需要身份验证。

我的问题是我需要能够从运行块访问服务以获取某些授权功能,并且当我将mfAuth服务注入我的runBlock函数时,我发现AUTH_EVENTS.notAuthenticated被正确检测但是$ state .go方法不起作用,用户不会被重定向到登录状态。

我一直在读书,但找不到任何有关问题的提示。我已经尝试过监听ui-router的$ stateChangeError事件并且它没有被触发。我没有想法,所以我想转向堆栈溢出。我已经尝试在堆栈溢出时找到类似的问题,我确定答案已经存在,但我很难找到正确的关键字来找到问题。

任何人都可以提供帮助吗?

UPDATE 我刚刚在$ stateChangeStart上添加了以下日志记录...

$rootScope.$on('$stateChangeStart',
    function (event, toState, toParams, fromState, fromParams) {
        console.log("event: ", event);
        console.log("toState: ", toState);
        console.log("toParams: ", toParams);
        console.log("fromState: ", fromState);
        console.log("fromParams: ", fromParams);
    });

这会产生以下控制台输出

event:  Object {name: "$stateChangeStart", targetScope: Scope, defaultPrevented: false, currentScope: Scope} core.run.js:63
toState:  Object {url: "/auth/login", views: Object, bodyClass: "login", name: "app.auth_login"} core.run.js:64
toParams:  Object {} core.run.js:65
fromState:  Object {name: "", url: "^", views: null, abstract: true} core.run.js:66
fromParams:  Object {} core.run.js:62
event:  Object {name: "$stateChangeStart", targetScope: Scope, defaultPrevented: false, currentScope: Scope} core.run.js:63
toState:  Object {url: "/dashboard", views: Object, resolve: Object, name: "app.dashboard"} core.run.js:64
toParams:  Object {} core.run.js:65
fromState:  Object {name: "", url: "^", views: null, abstract: true} core.run.js:66
fromParams:  Object {}

所以问题是服务的getSession正在触发并请求导航到登录状态之前的任何其他内容,例如($ urlRouterProvider.otherwise和输入到浏览器地址栏的url)。

0 个答案:

没有答案
相关问题