2016-04-19 17 views
0

In winkel run Block Ich setze eine Eigenschaft auf $ rootScope, aber wenn Controller führt diese Eigenschaft nicht existiert auf $ rootScope.

Wenn die Anwendung startet, im Debugger sehe ich "adal: loginSuccess" Handler ausgeführt wird und $ rootScope.isAdmin bekommen Sätze auf "wahr", aber wenn Controller starten die $ rootScope.isAdmin nicht existiert auf $ rootScope. Warum? Unten ist mein Code

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 app.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

Der Event-Handler "adal: loginSuccess" läuft wahrscheinlich hinter dem Controller – rob

+0

Wie stelle ich sicher, dass adal: logingSuccess zuerst auftritt, bevor der Controller startet? – LP13

+0

Wenn Sie verhindern wollen, dass ein Controller geladen wird, bis etwas anderes geladen ist, können Sie einen Router 'resolve' https://docs.angularjs.org/api/ngRoute/provider/$routeProvider – rob

Antwort

0

Weil Sie var main = angular.module('mymodule', [...]) haben, so ist die App 'mymodule' genannt; Für Ihre Controller haben Sie jedoch angular.module('Mycontrollers', []). Was Sie getan haben, ist eine neue Instanz von Angular zu instanziieren. Angular bootet nur die erste Instanz der Instanziierung, also müsste verwendet werden, aber ich vermute, das ist nicht das, was Sie wollen. Ersetzen Sie stattdessen angular.module('Mycontrollers', []) durch angular.module('mymodule').controller(...). Beachten Sie das Fehlen von Klammern. Jetzt verwenden Sie das Modul, das Sie bereits instanziiert haben.

+0

Nein das ist nicht korrekt, siehe meinen aktualisierten Code. "MyController" -Modul ist tatsächlich in Main enthalten .. Ich habe nicht den ganzen Code-Block .. – LP13

+0

Das ist kein Modul. Das ist eine Abhängigkeit. Sie können einen Controller keiner Abhängigkeit zuweisen. Auch mein Argument, Angular wieder instanziieren zu wollen, ist immer noch ein Problem. Da es instanziiert wird, teilt es nicht das gleiche $ rootScope wie die anfängliche instanziierte Angular-App von 'mymodule'. –

+0

@ChrisStanley Sie können mehrere Module in Angular erstellen und sie werden alle das gleiche "$ rootScope" teilen: https://plnkr.co/edit/jSYYfUpuQuAzQ5s2pbLn?p=preview – rob

Verwandte Themen