[英]Angular $rootScope $on listeners in 'destroyed' controller keep running
[英]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
}
解決了我遇到的類似問題
你可以做幾件事,這里有兩個例子。 檢查這個小提琴中的控制台
第一個是在$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);
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.