luz*_*zny 19 javascript devise angularjs angular-services angular-ui-router
如何创建全局可访问的服务,currentUser()只在页面加载时调用服务器一次,如果用户登录然后保留它并向控制器或状态提供数据直到注销?现在我在许多州或控制器中解决了很多次currentUser(),我在docs中发现:authparseresponse它可以自己做服务,但我不知道如何以正确的方式处理这个问题.
例如在ui-router中我有两个服务器调用,只有在加载页面时才足够:
.state('login', {
url: '/login',
templateUrl: 'auth/_login.html',
controller: 'AuthCtrl',
onEnter: [
'$state', 'Auth',
function($state, Auth) {
Auth.currentUser().then(function() {
$state.go('home');
});
}
]
})
.state('dashboard', {
url: '/dashboard',
templateUrl: 'dashboard.html',
onEnter: [
'$state', 'Auth',
function($state, Auth) {
Auth.currentUser().then(function(user) {}, function(err) {
$state.go('home');// user not logged in
});
}
]
})
Run Code Online (Sandbox Code Playgroud)
或者每次在NavController中调用下一个服务器:
app.controller('NavController', [
'$state', '$scope', 'Auth', function($state, $scope, Auth) {
$scope.signedIn = Auth.isAuthenticated;
$scope.logout = Auth.logout; // logout function
Auth.currentUser().then(function(user) {
$scope.user = user;
});
$scope.$on('devise:login', function(e, user) {
$scope.user = user;
});
$scope.$on('devise:logout', function(e, user) {
$scope.user = {};
$state.go("home");
});
}
]);
Run Code Online (Sandbox Code Playgroud)
我找到了类似的问题,没有回答:stackoverflow
Bha*_*han 11
我们知道工厂是一个单独的对象,基本上它用于数据共享.我们可以将它注入任何控制器并作为依赖项运行.这也可以解决您的问题.将此服务注入到您的状态解析块并检查用户是否存在,如果没有,则调用工厂的获取用户功能
app.factory("User", function($http, $q, $rootScope) {
var user = null;
return {
fetchUser: function() {
/*your ajax call that return current user*/
user = YOUR_SERVER_RESPONSE;
return user;
},
getUser : function(){
return user;
},
setUser : function(u){
user = u;
}
}
Run Code Online (Sandbox Code Playgroud)
});
你的状态配置块看起来像
.state('dashboard', {
url: '/dashboard',
templateUrl: 'dashboard.html',
resolve : function(User){
if(User.getUser()){
return User.getUser();
}else{
return User.fetchUser();
}
}
})
Run Code Online (Sandbox Code Playgroud)
我必须在一个大型Angular应用程序中处理用户身份验证,并发现这篇文章非常有用:https://medium.com/opinionated-angularjs/techniques-for-authentication-in-angularjs-applications-7bbf0346acec
具体到'如何让它只发生一次':
resolve为应用程序的外部状态的要求(如果使用嵌套状态)一个UserService服务代表用户的登录状态非常适用于在整个应用程序共享状态.登录和注销功能可以通过此服务公开,用户的详细信息也可以存储在此处.定义UserApi扩展$resource可能有助于将实际的HTTP问题与管理用户状态分开.
其他可能会引起您注意的问题,这两个问题都包含在本文中:跨页面刷新的持久状态,以及只有在用户登录时才能访问的站点区域.
| 归档时间: |
|
| 查看次数: |
6417 次 |
| 最近记录: |