2016-04-19 37 views
0

在angular的運行塊中,我在$ rootScope上設置了一個屬性,但是當控制器執行時,$ rootScope上不存在該屬性。

當應用程序啓動時,在調試器中,我看到「adal:loginSuccess」處理程序得到執行,$ rootScope.isAdmin將set設置爲「true」,但是當控制器開始執行$ rootScope.isAdmin時,並不存在於$ rootScope上。爲什麼? 下面是我的代碼

app.js

var main = angular.module('mymodule', [ 
     'ngAnimate','ngRoute','Mycontrollers','AdalAngular'... 

    ]); 

    main.config(['$httpProvider','adalAuthenticationServiceProvider', function ($httpProvider,adalProvider) { 
     adalProvider.init(
      { 
       // config Azure Client ID Here 
      }, 
      $httpProvider 
      ); 

    }]); 

    main.run(["$rootScope", "$state", "API", "usSpinnerService", 
     function ($rootScope, $state, API, usSpinnerService,) {  

      $rootScope.$on("adal:loginSuccess", function() { 
         $rootScope.isAdmin = user.isAdmin; 
      }); 

     }]); 

Controller.js

angular.module('Mycontrollers', []) 
    .controller('HeaderCtrl', ['$rootScope','$scope', 'adalAuthenticationService', function ($rootScope, $scope, adalAuthenticationService) { 

    //$rootScope.isAdmin is set in angular's run block above 
    //however $rootScope.isAdmin does not exists here, WHY????? 

    }]) 
+0

「adal:loginSuccess」事件處理程序可能在控制器後運行 – rob

+0

我如何確保adal:logingSuccess在控制器開始執行之前首先發生? – LP13

+0

如果你想阻止一個控制器加載,直到其他加載,你可以通過路由器'resolve' https://docs.angularjs.org/api/ngRoute/provider/$routeProvider – rob

回答

0

因爲你有var main = angular.module('mymodule', [...]),讓您的應用程序被命名爲 'MyModule的';但是,對於您的控制器,您有angular.module('Mycontrollers', [])。你所做的是實例化一個新的Angular實例。 Angular只會引導實例化的第一個實例,所以需要使用angular.bootstrap,但我猜這實際上並不是你想要的。相反,用angular.module('mymodule').controller(...)代替angular.module('Mycontrollers', [])。注意缺少括號。現在你正在使用你已經實例化的模塊。

+0

不,那是不正確的,看我更新的代碼。 'MyController'模塊實際上包含在主..我沒有把整個代碼塊.. – LP13

+0

這不是一個模塊。這是一個依賴。您無法將控制器授予依賴項。另外,關於再次實例化Angular的觀點仍然是一個問題。由於它正在實例化,它不會像最初實例化的'mymodule'Angular應用程序那樣共享相同的$ rootScope。 –

+0

@ChrisStanley你可以在Angular中創建多個模塊,它們將共享相同的'$ rootScope':https://plnkr.co/edit/jSYYfUpuQuAzQ5s2pbLn?p=preview – rob