我开发了angularjs应用程序,并且具有REST API,用于从AngularJS应用程序中获取应用程序资源。当用户登录自己时,我将其访问令牌保存在cookie中。如果他刷新页面,我想从令牌中获取用户信息,例如:
mymodule.run(function ($rootScope, $cookies, AuthService, Restangular) {
if ($cookies.usertoken) {
// call GET api/account/
Restangular.one('account', '').get().then( function(user) {
AuthService.setCurrentUser(user);
});
}
});
AuthService:
mymodule.factory('AuthService', function($http, $rootScope) {
var currentUser = null;
return {
setCurrentUser: function(user) {
currentUser = user;
},
getCurrentUser: function() {
return currentUser;
}
};
});
但是,如果用户访问需要用户变量的控制器:
mymodule.controller('DashboardCtrl', function (AuthService) {
var user = AuthService.getCurrentUser();
});
控制器代码是在API调用结束之前执行的,所以我有一个空var。是否有一个好的解决方案,可以在启动控制器之前等待用户数据加载?
我找到了this link,但我正在寻找一种更全局的方法来初始化应用程序上下文。
[这是我喜欢的一种处理方式,假设Restangular从then
返回新的承诺(我没有使用过Restangular)。承诺可以存储在AuthService
上的某个位置,然后在控制器中使用。首先,在AuthService
中添加一个属性以保存新的诺言:
return {
authPromise: {}, // this will hold the promise from Restangular
// setCurrentUser, getCurrentUser
// ...
[调用Restangular时,请保存诺言并确保返回用户数据,以便控制器以后可以访问它,如下所示:
AuthService.authPromise = Restangular.one('account', '').get()
.then( function(user) {
AuthService.setCurrentUser(user);
return user; // <--important
});
最后,在控制器中创建一个新的Promise,它将设置user
变量。:
mymodule.controller('DashboardCtrl', function (AuthService) {
var user;
AuthService.authPromise.then(function(resultUser){
user = resultUser;
alert(user);
// do something with user
});
});
Demo:Here is a fiddle,其中我已使用$timeout
模拟了AJAX调用。超时结束后,承诺就会解决。
您可以尝试在父控制器上使用身份验证方法。然后在路由的resolve方法中,您可以转到resolve:DashboardCtrl.$parent.Authenticate()
。