Angularjs 角度:等待应用程序运行以获得响应
截至,我正在尝试确定用户是否使用基于令牌的身份验证登录 该计划如下: 1/页面加载,调用app run,并将authenticated设置为false作为默认值Angularjs 角度:等待应用程序运行以获得响应,angularjs,authentication,Angularjs,Authentication,截至,我正在尝试确定用户是否使用基于令牌的身份验证登录 该计划如下: 1/页面加载,调用app run,并将authenticated设置为false作为默认值 app.run(function($http, UserService) { UserService.requestCurrentUser(); $http.defaults.xsrfHeaderName = 'X-CSRFToken'; $http.defaults.xsrfCookieName = 'csr
app.run(function($http, UserService) {
UserService.requestCurrentUser();
$http.defaults.xsrfHeaderName = 'X-CSRFToken';
$http.defaults.xsrfCookieName = 'csrftoken';
});
app.constant('AUTHENTICATED', false);
2/UserService调用其方法requestCurrentUser,其中http get被发送到正确的url,其标头中包含令牌
如果令牌是正确的,这将发回用户成功案例,我们将通过身份验证。
如果没有,我会得到一个权限错误案例,我们没有经过身份验证。
这将更新currentUserproperty和已验证的常量
app.factory('UserService', function ($http, $q, $window, AUTHENTICATED) {
var _currentUser = {};
return {
getCurrentUser: function() {
return _currentUser;
},
setCurrentUser: function(user) {
_currentUser = user;
},
requestCurrentUser: function() {
return $http.get('/accounts/api/').then(
function (response) {
_currentUser = response.data;
AUTHENTICATED = true;
},
function (error) {
AUTHENTICATED = false;
}
);
},
};
});
3/调用并验证控制器,并更新currentUser范围值
app.controller('AuthCtrl', function ($scope, AuthService, UserService, AUTHENTICATED) {
$scope.authenticated = AUTHENTICATED;
$scope.currentUser = UserService.getCurrentUser();
});
问题是,控制器试图在应用程序运行中启动的requestCurrentUser方法收到响应之前达到这些值。那么我应该在哪里启动requestCurrentUser来获得预期的行为呢
感谢您所能做的将用户状态对象包装到父对象中。例如:
var state = {
_currentUser: {}
};
return {
getUserState: function(){ return state; }
};
然后在控制器内:
$scope.state = UserService.getUserState();
这样,当您的用户无论何时或如何在您的服务中更新时,绑定到该状态的任何内容都将收到更新。因此,您的控制器将有权访问状态。\u currentUser(如果可用)。感谢您的回答,因为我所经历的应该是相当普遍的,我想知道是否有一个最佳实践可以实现我的目标。我是一个新的角度,我想也许我应该重新思考我的结构更全面?也许app.run不是请求当前用户的地方。拥有管理用户状态的服务是一个不错的选择。如果您将用户包装在容器对象中,并将任何异步相关的进程包装在承诺中,那么您应该做得很好。这样你就可以在任何地方注入你的用户服务,并用它做你想做的事情。对于功能布局没有特定的标准,比如user auth,但是您应该能够找到大量的示例。继续试验并决定什么最适合您。策略可能取决于是否需要阻止路径以及使用哪个路由器。例如,在ui路由器中,可以使用单个父级状态解析,所有需要验证的路由都可以设置为子级状态,如果父级解析被拒绝,则所有子级状态都不可访问。其他策略包括使用route start event解决身份验证此主题的大量教程有此类教程的示例吗?谢谢