2013-06-06 7 views
5

$ rootScopeに変数をロードする.run()内にajax呼び出しがあります。 ビューに関連付けられたコントローラでその変数が必要です。角度.controller()は.run()より前に実行されます。

はTypeError:結果としての$ rootScope.user.fedUnit内部の何も.controllerがロードされた時点でリフレッシュ(F5)で時々

ありません未定義

任意のプロパティ「fedUnit」を読み取ることができません.run()が終了するまでコントローラのロードを遅らせる方法はありますか? 見つからないことがあります。機能コードブロックで@misterhillerへ

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

ソリューション

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

感謝(ツイッター)

+3

コントローラがロードされる前に 'run()'が実際に終了していると感じます - run()は非同期呼び出しを含んでいるようです - ブラウザが実行を続けている間に呼び出され、あなたのコントローラを呼び出しているプロセスでは、GET要求はまだ返ってこなかったので(その分割秒で)、エラーが発生します。 - 'SessionFactory'サービスのコードを投稿できますか? – callmekatootie

+0

これを非同期にする必要があります。 AJAXリクエストをロードするプロバイダを作成します。 – TheHippo

+0

はい、Sessionfactoryは、ある種の残りのAPIに対する単純な$リソース呼び出しです。 – fritz

答えて

7

ソリューション:

私は$ rootScopeを使用していない
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}); 
     } 
    }); 
}); 

コントローラ。

関連する問題