角度:在初始化控制器之前重新加载$rootscope用户
Angular: Reload $rootscope user before initializing controller
我正在使用AngularJS开发SPA。登录后,将使用令牌创建一个 Cookie,并将用户对象存储在$rootScope.user
中,当它们动态加载时,可以从各种控制器方便地访问该对象。
当我正常使用它并四处导航时,该应用程序工作正常。
当我使用 F5 刷新页面时,angular 被重新加载,模块 run(( 方法检查 cookie 是否存在并将用户从服务器重新加载到 $rootScope.user
中。但是,当这种情况发生时,另一个控制器已经期望$rootScope.user
有一个用户。
如何在$rootScope.user
准备就绪并加载之前防止控制器初始化。当然,如果可以的话,请检查控制器中是否有用户加载$rootScope
.但是如果没有,$rootScope
如何调用控制器来执行一些初始化呢?
下面是 app.run(( 中的代码:
app.run(function ($rootScope, $location, $cookies, appServices) {
var token = $cookies.get('UserToken');
if (token) $rootScope.token = token;
$rootScope.$on("$routeChangeStart", function (event, next, current) {
// Get user from server if token is there but no user
if ($rootScope.user == null) {
if ($rootScope.token) {
appServices.getUserByToken(token).then(function (d) {
if (d.Code == 1) {
$rootScope.user = d.ReturnObj;
if ($rootScope.user != null && next.templateUrl == "web/views/signin.html") $location.path("/dashboard");
} else $rootScope.goSignin(next.templateUrl);
});
}
else $rootScope.goSignin(next.templateUrl);
}
});
})
下面是动态加载的控制器中的示例代码:
app.registerCtrl('userdetailCtrl', function userdetailCtrl($scope, $http, $rootScope, $routeParams, appServices, $location, validationService) {
$scope.getOffices=function()
{
appServices.getOffices({ ID: $rootScope.user.OrgID, Token: $rootScope.token }).then(function (d){
if(d.Code==1){$scope.office = d.ReturnObj;}});
}
$scope.getOffices();
});
getOffices()
函数需要$rootScope.user.OrgID
,因为尚未加载$rootScope.user
所以找不到。
有什么想法吗?
不确定这是否适用于您的情况,但是
$rootScope.$on('$includeContentLoaded', function () {
//fetch user here
}
解决了我遇到的类似问题
您可以执行以下几件事,以下是其中两件事的示例。检查此小提琴中的控制台
1. 观察变量的变化:
首先是监视控制器$rootScope.user
的变化:
应用运行:
$timeout(function() {
$rootScope.user = 'user';
}, 500)
在控制器中:
$rootScope.$watch('user', function(newVal, oldVal) {
console.log(newVal, $rootScope.user);
});
如果您不想在每次用户变量更改时继续执行代码,您也可以"取消监视"。
2. 发出事件
第二种是发出一个事件,并在需要时捕获它,如下所示:
应用运行:
$timeout(function() {
$rootScope.user = 'user';
$rootScope.$broadcast('userEvent');
}, 500)
您的控制器:
$rootScope.$on('userEvent', function() {
console.log($rootScope.user);
});
相关文章:
- Rails:如何向用户预加载消息
- 强制用户重新加载页面
- 防止用户在jQuery Mobile中ajax加载页面时单击其他位置
- 如果图像标记是用javascript编写的,并且需要用户输入,那么图像不会随页面加载吗
- 如何知道用户已经重新加载了网页,使用jquery.如果用户重新加载网页,
- 基于用户加载不同的controller/js文件'访问级别
- 如何只重新加载用户脚本,即不重新加载页面
- 当用户到达页面右侧时加载新内容
- 调用按钮单击事件 ajax 加载的用户控件
- 根据用户屏幕大小加载 JS 或 PHP
- 如何在用户提交后退按钮时重新加载同一页面
- 如何加载用户列表并并行呈现它们
- HTML5 localStorage加载用户输入变量
- HTML加载用户单击按钮时输入的输入字段数
- 单击加载用户语音API
- 如何在CMS中重新加载用户定义的标签变得简单
- 在AngularJS中,在控制器之前加载用户上下文
- 动态加载用户控件在ie11和Chrome中不工作
- 在JSP页面上加载用户帖子
- 在网页上加载用户选择的图像