Angulaire .contrôleur() s'exécute avant .run()

J'ai un appel ajax à l'intérieur de l' .run() qui charge une variable dans $rootScope
Cette variable est nécessaire dans le contrôleur associé à une vue.

Parfois sur refresh (F5) au moment où l' .contrôleur de chargement il n'y a rien à l'intérieur de $rootScope.de l'utilisateur.fedUnit:

TypeError: Cannot read property 'fedUnit' undefined

Toute façon à retarder le chargement du contrôleur jusqu'à ce que après le .run() est fini?
N'arrive pas à trouver.

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) { ...

Solution

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

grâce à @misterhiller (twitter)

J'ai l'impression que votre run() a fait terminé avant que le contrôleur de charge - c'est juste que le run() semble contenir un appel asynchrone - Il est appelé et oublié jusqu'à ce qu'il retourne, alors que le navigateur procède à l'exécution de la prochaine série de code dans le processus de l'appel de votre contrôleur - depuis la demande d'OBTENIR ne serait toujours pas revenu (en une fraction de seconde) et donc des résultats à l'erreur - Pourriez-vous poster le code de la SessionFactory service?
Vous avez besoin de faire ce travail de manière asynchrone. Créer un fournisseur qui charge effectue la requête AJAX.
Oui, La Sessionfactory est un simple $ressource appel à une sorte d'API rest.
Merci pour la solution. Que safed ma journée. J'ai donc ajouté un code fonctionnel de l'échantillon.

OriginalL'auteur fritz | 2013-06-06