2013-06-06 14 views
5

$ rootScope'a bir değişken yükleyen .run() içinde ajax çağrısı var Bu değişken, bir görünümle ilişkili denetleyicide gereklidir.Açısal .controller(), daha önce çalışır. R()

TypeError: sonuçlanan $ rootScope.user.fedUnit içinde bir şey .controller yükleniyor zaman refresh (F5) üzerine Bazen

orada tanımsız

Herhangi malı 'fedUnit' okunamıyor kontrolörün .run() bittikten sonra yüklenmesini geciktirmenin yolu nedir? Bulamıyor gibi görünüyor. Ben $ rootScope kullanmayan

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}); 
     } 
    }); 
}); 

:

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

Çözüm @misterhiller için

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

sayesinde

+3

Denetleyicinin yüklenmesinden önce run() 'un gerçekten bitmiş olduğunu hissediyorum - sadece run() işlevi eşzamansız bir çağrı içeriyor gibi görünüyor - Tarayıcı, yürütme ile devam ederken, geri gelene kadar çağrılır ve unutulur Bir sonraki kod kümesinin - denetleyicinizi çağıran süreçte - GET isteği hala (bölünmüş ikinci) döndürülmediğinden ve hatayla sonuçlandığından - SessionFactory hizmetinin kodunu gönderir misiniz? – callmekatootie

+0

Bu çalışmayı senkronize olmayan bir şekilde yapmanız gerekir. AJAX isteğini gerçekleştiren bir yükleyici sağlayıcı oluşturun. – TheHippo

+0

Evet, Sessionfactory, bir tür dinlenme API'sı için basit bir $ kaynak çağrıdır. – fritz

cevap

7

fonksiyonel kod bloğundaki çözeltisi (twitter) kontrol eden, denetleyici.