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)
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
Musisz to zrobić asynchronicznie. Utwórz dostawcę, który ładuje, wykona żądanie AJAX. – TheHippo
Tak, Sessionfactory jest prostym wezwaniem zasobów do jakiegoś odpoczynku API. – fritz