我已经制作了一个AuthService,可以帮助我处理所有身份验证问题,例如登录,注册,从服务器获取用户数据等。
我正在寻找一种只能在登录,页面刷新和触发刷新时运行的解决方案,从服务中获取用户数据并使其在包含服务的控制器上可用。我希望有类似vm.user = AuthService.getUserData()的东西,这将从服务返回会话变量。像这样:
function getUserData(){
if (session) {
return session.user;
}
return null;
}
On $ rootScope。$ on('$ stateChangeStart'我有:
AuthService.loadSessionData();
转换为:
function loadSessionData() {
$http({
url: API.URL+'auth/session-data',
method: 'GET'
})
.success(function(response)
{
session = response;
})
.error(function(err){
console.log(err);
});
};
这里的一个问题是我必须在AuthService.getUserData()上设置超时,因为当执行此操作时,从服务器检索会话数据的调用尚未完成,但这是一种不好的做法。 / p>
以下是完整的服务代码http://pastebin.com/QpHrKJmb
答案 0 :(得分:2)
如何使用resolve?如果我理解正确,您仍希望在控制器中获得此数据。
您可以将其添加到州定义中:
.state('bla', { template: '...' controller: 'BlaCtrl', resolve: { user: ['AuthService', function(AuthService) { return AuthService.loadSessionData(); } } }
另外,改变你的loadSessionData函数:(确保将$ q注入 AuthService )
function loadSessionData() { return $q(function(resolve, reject) { $http({ url: API.URL + 'auth/session-data', method: 'GET' }) .success(function(response) { if (response) { resolve(response); } else { reject(); } }) .error(function(err){ reject(err); }); }) }
最后,将解析函数中的 user 对象添加到控制器:
app.contoller('BlaCtrl', ['$scope', 'user', function($scope, user) { $scope.user = user; }]);
这取得了什么成果?
如果用户没有有效会话或发生错误,则拒绝状态更改并抛出事件 $ stateChangeError 。您可以收听(就像您为 $ stateChangeStart 为该事件所做的那样,并使用模式进行响应,重定向到错误页面等等。
您只需为需要它的州提取会话 - 而不是针对每个州的变化。
在解析用户数据(通过解决或拒绝)之前,状态不会得到解决。
答案 1 :(得分:0)
您应该在getUserData()
中调用loadSessionData()function getUserData(){
loadSessionData()
.success(function(response)
{
if (response) {
return response.user;
}
})
return null;
}
和
function loadSessionData() {
return $http.get(API.URL+'auth/session-data');
};