我正在使用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
尚未加载,因此找不到该文件。
有什么想法吗?
答案 0 :(得分:0)
不确定这是否适用于您的情况,但
$rootScope.$on('$includeContentLoaded', function () {
//fetch user here
}
解决了我遇到的类似问题
答案 1 :(得分:0)
你可以做几件事,这里有两个例子。检查此fiddle
中的控制台第一个是关注控制器中的更改$rootScope.user
:
App.run:
$timeout(function() {
$rootScope.user = 'user';
}, 500)
在您的控制器中:
$rootScope.$watch('user', function(newVal, oldVal) {
console.log(newVal, $rootScope.user);
});
如果您不希望每次用户变量更改时都继续执行代码,也可以“取消监视”。
第二个是发出一个事件,并在需要时捕获它,如下所示:
App.run:
$timeout(function() {
$rootScope.user = 'user';
$rootScope.$broadcast('userEvent');
}, 500)
你的控制器:
$rootScope.$on('userEvent', function() {
console.log($rootScope.user);
});