在AngularJS中,在控制器之前加载用户上下文
Loading user context before controllers in AngularJS
我开发了一个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调用结束之前执行,所以我有一个空变量。在启动控制器之前,是否有一个很好的解决方案来等待用户数据加载?
我已经找到了这个链接,但我正在寻找一个更全局的方法来初始化应用程序上下文
这是我喜欢处理这个问题的一种方式,假设Restangular从then
返回新的承诺(我没有使用过Restangular)。promise可以存储在某个地方,比如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
});
最后,在控制器中创建一个新的承诺,将设置user
变量:
mymodule.controller('DashboardCtrl', function (AuthService) {
var user;
AuthService.authPromise.then(function(resultUser){
user = resultUser;
alert(user);
// do something with user
});
});
Demo:这里是我用$timeout
模拟AJAX调用的一个小提琴。当超时结束时,promise解析
您可以尝试在父控制器上使用身份验证方法。然后在路由的resolve方法中,你可以进入resolve:DashboardCtrl.$parent.Authenticate()
.
相关文章:
- Rails:如何向用户预加载消息
- 强制用户重新加载页面
- 防止用户在jQuery Mobile中ajax加载页面时单击其他位置
- 如果图像标记是用javascript编写的,并且需要用户输入,那么图像不会随页面加载吗
- 如何知道用户已经重新加载了网页,使用jquery.如果用户重新加载网页,
- 基于用户加载不同的controller/js文件'访问级别
- 如何只重新加载用户脚本,即不重新加载页面
- 当用户到达页面右侧时加载新内容
- 调用按钮单击事件 ajax 加载的用户控件
- 根据用户屏幕大小加载 JS 或 PHP
- 如何在用户提交后退按钮时重新加载同一页面
- 如何加载用户列表并并行呈现它们
- HTML5 localStorage加载用户输入变量
- HTML加载用户单击按钮时输入的输入字段数
- 单击加载用户语音API
- 如何在CMS中重新加载用户定义的标签变得简单
- 在AngularJS中,在控制器之前加载用户上下文
- 动态加载用户控件在ie11和Chrome中不工作
- 在JSP页面上加载用户帖子
- 在网页上加载用户选择的图像