我是angularJs的新手,我正在尝试在我的应用程序中实现登录/注销。
我有一个用户登录的AuthService,以及一个将auth令牌写入本地存储的SessionService(我正在使用jwt)
这里是AuthService:
'use strict';
angular.module('App')
.factory('AuthService', ['ApiService', 'SessionService', '$q', '$timeout', 'jwtHelper', function (ApiService, SessionService, $q, $timeout, jwtHelper) {
// inherit
var service = Object.create(ApiService);
service.login = login;
service.logout = logout;
service.check = check;
service.user = user;
return service;
function login(credentials) {
return service.form('user.login', credentials)
.then(function success(response) {
SessionService.setToken(response.token);
return response;
});
}
function logout() {
// here we use a promise so it's easier to handle
// logout in the controller by chaining methods
var d = $q.defer();
$timeout(function () {
SessionService.setToken();
d.resolve();
}, 0);
return d.promise;
}
function check() {
var token = SessionService.getToken();
return !!token && !jwtHelper.isTokenExpired(token);
}
function user() {
return service.call('user', {cache: true});
}
}]);
我在注销方法中面临的问题。我没有服务器调用,只是清除本地存储并且用户已注销,但我想通过一个承诺来处理这个,所以在控制器中我可以执行以下操作:
function logout() {
AuthService.logout().then(function success() {
$state.go('login');
});
}
这是实现这个目标的好方法吗?
答案 0 :(得分:0)
我认为在您的特定情况下不需要承诺,我会以另一种方式设计:
我会在$ rootScope中存储一个“authenticatedUser”,其中包含一些我可能会发现有用的参数(用户文化,角色,......(如果没有其他要求,则只是一个布尔值)。)
在一种“applicationController”中,我会看$ watch *寻找它的值:
$rootScope.$watch('authenticatedUser', function(newVal, oldVal){
if (newVal == oldVal)
return;
if (newVal == null){ //User has been disconnected
//Remove everything from screen
//Display login form
}
});
所以,在你的控制器中,我只会:
function logout() {
AuthService.logout();
}
这样,如果有一天你决定能够从另一个控制器注销(我们永远不知道会发生什么;-)),你只需要打电话给你的服务,一切都会完成。不需要重复代码。
此外,您的代码中还有一些我不理解的内容:
// inherit
var service = Object.create(ApiService);
在角度中,每个服务都是在角度引导期间实现的单例。您确定要覆盖此默认行为吗?