2016-09-05 7 views
0

角度uiルーティングと状態のアプリケーションを作成しました。また、私はユーザーが認証されているかどうかを学習するために使用できるWEB APIコントローラを持っています。問題は、そのWEB APIへのhttp要求が、非同期であるため、結果を返すための遅延があることです。

ユーザーが状態を継続したいとき、認証されているかどうかをチェックして、彼にアクセス権を与えたり、ログインページにリダイレクトしたりするたびに、必要とします。しかし、私は私のWEB APIから答えるまで私が待っていたいsomewayと一緒に走っているアプリが初めてです。

は、私は、コード

PlatformWeb.run(function ($rootScope, $state, $timeout, Authorization) { 

$rootScope.$state = $state; 

$rootScope.User = { 
    isAuthenticated: null, 
    targetState: null 
} 
Authorization.isAuthenticated().then(function (result) { 
    $rootScope.User.isAuthenticated = result; 

    $state.go($rootScope.User.targetState.name); 
}) 
hasAccess = function() { 
    return $rootScope.User.isAuthenticated; 
} 

$rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) { 
    $rootScope.User.targetState = toState; 
    if ($rootScope.User.isAuthenticated == null) 
     event.preventDefault(); 
    else { 
     if (!hasAccess()) { 
      event.preventDefault(); 
      $state.go('PlatformWeb.Login'); 
     } 
    } 
});}); 

アプリを実行すると、$ rootScope.User.isAuthenticatedがnullの初めてのこの部分を持っているので、私は状態をロードするために防ぐことができます。私の 'Authorization'サービスでは、認証されているかどうかをユーザーに知らせるために私の非同期関数を呼び出します。あなたがWEP APIから私の結果を戻すときに、私は状態 '$ state.go($ rootScope.User.targetState.name);を変更するので、私はあなたが行くことを望むときに私は状態を維持する前に、彼が望む状態に。それから私は、認証されているかどうかを知っています。彼がいない場合、私は彼をログイン状態にリダイレクトします。

BUT event.preventDefault();は期待どおりに機能しません。私は私のアプリケーションを実行するとき、私はこのエラー 'angular.min.js:6キャッチコピーエラー:[$ rootScope:infdig] http://errors.angularjs.org/1.3.7/ $ rootScope/infdig?p0 = 10 & p1 =%5B%5D'を複数回取得します。 角度のある文書によると、 '10 $ digest()の繰り返しに達しました。中止! 最後の5回の反復でウォッチャーが発生しました:[] '

私のロジックでは、' stateChangeStart 'はevent.preventDefault();で' $ rootScope.User.isAuthenticated == null 'という条件で機能します。私は知る限り、ここにアプリケーションログを作成し、それ以上実行することはありません。私がWEBAPIから私の結果を返すとき、私はこの機能で再び行くだろうが、今回私は彼をどの国に送るべきかを知っている。

答えて

0

私は、まず常に電流の変化がにナビゲートしている場合...チェックして、それはもうええ、これは良いアイデアです

$rootScope.$on('$stateChangeStart', 
    function (event, toState, toParams, fromState, fromParams) { 
    // are we already going to redirection target? 
    if(toState.name === 'PlatformWeb.Login'){ 
     return; // yes, so do not execute the rest again... 
    } 
    $rootScope.User.targetState = toState; 
    if ($rootScope.User.isAuthenticated == null) 
     event.preventDefault(); 
    else { 
     if (!hasAccess()) { 
      event.preventDefault(); 
      // we will redirect here only if not already on that way... 
      $state.go('PlatformWeb.Login'); 
      ... 
+0

をリダイレクトされているかどうかを取得するには、お勧めします。問題はそれがevent.preventDefault()です。期待どおりに動作していないし、アプリの待機をしない。 – GomuGomuNoRocket

+0

プランナーを作成できますか?私は助ける準備ができていますか?作業の例http://stackoverflow.com/a/26800804/1679310といくつかのリソースを確認してください... –

+0

またこちら.. http://stackoverflow.com/a/26135437/1679310。デフォルトを防止するために、あなたのコードの流れではなく、標準のJSの動作を止めることができます。 toStateがあなたがリダイレクトしたいものであれば、リターンを使って出てください。 –

関連する問題