2013-06-06 16 views
5

Mam wywołanie ajax wewnątrz .run(), który ładuje zmienną do $ rootScope Ta zmienna jest potrzebna w kontroler skojarzony z widoku.Angular .controller() działa przed .run()

czasami odświeżania (F5) przy czasie .controller jest ładowanych nie ma nic wewnątrz $ rootScope.user.fedUnit skutkuje:

TypeError: nie można odczytać właściwość 'fedUnit' undefined

Any sposób opóźnienia ładowania kontrolera, aż po zakończeniu .run()? Nie można tego znaleźć.

app.run(function($rootScope, $http, $location, SessionFactory, TokenHandler) { 
    token = TokenHandler.getToken(); 
    if (token != null) { 
     SessionFactory.get({ token : token }, 
      function success(response, responseHeaders) { 
       $rootScope.user = response; 
      } 
     ); 
    } 
}); 

app.controller('UnitController', function($scope, $rootScope, $location, UnitFactory) { 
    $scope.updateUnits = function() { 
     UnitFactory.query({fedUnit: $rootScope.user.fedUnit}, function success(response, responseHeaders) { ... 

Rozwiązanie

$rootScope.foo = $q.defer(); 
$rootScope.foo.resolve(); when AJAX is done; 
$rootScope.foo.promise.then(..) in the controller. 

dzięki @misterhiller (twitter)

+3

Czuję, że twoje 'run()' faktycznie skończyło się przed załadowaniem kontrolera - jego tylko to, że run() wydaje się zawierać asynchroniczne wywołanie - jest wywoływane i zapominane, dopóki nie wróci, podczas gdy przeglądarka kontynuuje wykonanie następnego zestawu kodu - w procesie wywołującym twój kontroler - ponieważ żądanie GET nadal nie powróciłoby (w tej ułamku sekundy), a zatem powoduje błąd - Czy mógłbyś opublikować kod dla usługi 'SessionFactory'? – callmekatootie

+0

Musisz to zrobić asynchronicznie. Utwórz dostawcę, który ładuje, wykona żądanie AJAX. – TheHippo

+0

Tak, Sessionfactory jest prostym wezwaniem zasobów do jakiegoś odpoczynku API. – fritz

Odpowiedz

7

roztworu w funkcjonalnym bloku kodu:

app.run(function($rootScope, $http, $q, SessionFactory, TokenHandler) { 

    $rootScope.ajaxCall = $q.defer(); 

    token = TokenHandler.getToken(); 
    if (token != null) { 
     SessionFactory.get({ token : token }, 
      function success(response, responseHeaders) { 
       $rootScope.user = response; 

       $rootScope.ajaxCall.resolve(); 
      } 
     ); 
    } 
}); 

app.controller('UnitController', function($scope, UnitFactory) { 

    $scope.ajaxCall.promise.then(function() { 
     $scope.updateUnits = function() { 
      UnitFactory.query({fedUnit: $scope.user.fedUnit}); 
     } 
    }); 
}); 

nie używam $ rootScope w kontroler.