簡體   English   中英

Angular:在初始化控制器之前重新加載$ ​​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中查看控制器中的更改:

App.run:

$timeout(function() {
    $rootScope.user = 'user';
}, 500)

在你的控制器中:

$rootScope.$watch('user', function(newVal, oldVal) {
   console.log(newVal, $rootScope.user); 
});

如果您不希望每次用戶變量更改時都繼續執行代碼,也可以“取消監視”。

2.發送活動

第二個是發出一個事件,並在需要的地方捕獲它,如下所示:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM