在路由启动和路由数据请求解决之前,我需要针对我的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请求?
如果这个问题不明确,我请你澄清,我会澄清。
答案 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方法之前运行。