2016-04-19 2 views
0

В блоке запуска angular я устанавливаю одно свойство на $ rootScope, однако, когда контроллер выполняет это свойство, он не существует на $ rootScope.

Когда приложение запускается, в отладчике я вижу, что обработчик adal: loginSuccess запускается, а $ rootScope.isAdmin делает набор значений «истинно», однако, когда запускается контроллер $ 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.bootstrap, но я предполагаю, что на самом деле вы этого не хотите. Вместо этого замените angular.module('Mycontrollers', []) на angular.module('mymodule').controller(...). Обратите внимание на отсутствие скобок. Теперь вы используете модуль, который вы уже создали.

+0

нет, это неверно, см. Мой обновленный код. Модуль «MyController» фактически включен в main..i не помещал весь блок кода. – LP13

+0

Это не модуль. Это зависимость. Вы не можете дать контроллеру зависимость. Кроме того, моя точка зрения о создании экземпляра «Угловая» снова остается проблемой. Поскольку он создается, он не будет использовать тот же самый $ rootScope, что и начальное приложение с угловым выражением «mymodule». –

+0

@ChrisStanley вы можете создавать несколько модулей в Angular, и все они будут иметь один и тот же '$ rootScope': https://plnkr.co/edit/jSYYfUpuQuAzQ5s2pbLn?p=preview – rob