如何在我的角应用程序的路由启动之前执行AJAX请求?

时间:2014-06-04 18:20:29

标签: javascript angularjs authentication

在路由启动和路由数据请求解决之前,我需要针对我的API执行AJAX请求以获取身份验证信息(我使用服务器到服务器的OpenID身份验证解决方案)。

我目前正在初始化我的应用程序:

angular.module('mynamespace.admin', [
    'ngRoute',
    'ui.bootstrap',
    'mynamespace.directives',
    'mynamespace.filters',
    'mynamespace.factories',
    'mynamespace.resources',
    'mynamespace.admin.templates',
    'mynamespace.admin.forms'
]);

angular.module('mynamespace.admin').run(['$rootScope', '$http', 'base64', function($rootScope, $http, base64) {
    if (!window.location.origin) {
      window.location.origin = window.location.protocol + '//' + window.location.hostname + (window.location.port ? ':' + window.location.port: '');
    }

    // I NEED THIS TO FINISH BEFORE ROUTES RUN AND PERFORM
    // HTTP REQUESTS TO RESOLVE DATA
    $http.get(window.location.origin + '/account').success(function(accountData) {
        $rootScope.accountData = accountData;

        // Set up auth headers to be sent with every HTTP request.
        $http.defaults.headers.common = { 'Access-Control-Request-Headers': 'accept, origin, authorization' };
        $http.defaults.headers.common['Authorization'] = 'Basic ' + base64.encode(accountData.apiKey + ':' + accountData.apiPassword);
    });
}]);

angular.module('mynamespace.admin').config(['$routeProvider', function($routeProvider) {
    $routeProvider
        .when('/', {  // THIS IS RUNNING BEFORE THE $http REQUEST in .run() finishes
            redirectTo: '/forms'
        });
}]);

路由在最后的.config()回调中启动。不幸的是,/ forms路由包含具有解析项的路由,在我在.run()回调中设置公共$ http头之前,这些路由最终会产生$ http请求。基本上我有竞争条件。

所以,我的问题是:我如何执行并完成一个AJAX请求并确保它在我的应用程序的路由启动和路由开始制作之前返回AJAX请求?

如果这个问题不明确,我请你澄清,我会澄清。

2 个答案:

答案 0 :(得分:2)

使用angularChangeStart事件的角度。

var checkAuthentication = function(event, routeChange) {
    routeChange.$$route.resolve = {
        app: function($q) {
            var deferred = $q.defer();
            //Authentication({deferred.resolve();})
            return deferred.promise;
        }
    }
}

$rootScope.$on('$routeChangeStart', checkAuthenticationFn);

答案 1 :(得分:0)

(由于我的声望点,不能添加评论,sry。) 尝试搜索" .run" angular.module的方法,也许它可以帮到你。

以下是.run方法的答案: https://stackoverflow.com/a/20664122/2334204

- 编辑 -

甚至.config方法也在.run方法之前运行。