2017-10-14 2 views
0

私は、アクセスを確認するルート変更でサービスを呼び出そうとしています。trueがルートを開きます。そうでなければ、設定ルートに移動しますui-routerで解決済みの状態に戻ることはできません

app.js:私のhomeCtrlで

 .state('home', { 
      url: '/home', 
      templateUrl: 'home.html', 
      controller: 'homeController', 
      resolve: { 
       access: function(AuthService) { 

        return AuthService.getAccess(); 
       } 
      } 
     }) 

:私はどんな決意を持っていない別の状態に切り替えると、私はホームページに

app.controller('homeController', function ($scope, $timeout, $state, UserService, GroupService, SiteService, HomeService, AuthService, access) { 


    // Check access: if true init route, else go to settings 
    if(access) { 
     Collections.init(); 
    } else { 
     $state.go('settings'); 
    } 

}); 

を戻すことはできません、ボタンはちょうどd今は何もしません。

また、代わりにhomeCtrlからの設定に再方向を扱う、私は解決からこれを行うだろうか、それは角度の1.5.xおよびUI-ルータ0.2を使用して、より良いアプローチ

ではないでしょう私は決意を使用していませんでしたが、代わりに私がしかし気づいた何

$rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) { 
      AuthService.getAccess().then(function (access) { 
       if (!access && toState.name !== "settings") { 
        event.preventDefault(); 
        toastr.warning('Your trial has expired'); 
        $state.go('settings'); 
       } 
      }); 
     }); 

は私のUIがsometi時にロードすることである前に

:0.18

EDIT authService.getAccess()が実行される前に、私は競合状態に陥っていました。

解決フローに移動したので、アプリケーションフローをより適切に制御できました。

答えて

0

あなたがしたことに対する別のアプローチ - 各移行開始にコールバックを追加します。

const app = angular.module('yourApplication'); 

app.run([ 
    '$state', '$transitions', 'authManager', 
    function ($state, $transitions, authManager) { 

     $transitions.onStart({from: ''}, function (transition) { 
      const to = transition.$to(); 
      const routeName = to.name; 

      if(!authManager.isAuthorizedRoute(routeName)) { 
       // here you can substitute login with any other state 
       // returning another target will break the transition and direct to another state 
       return transition.router.stateService.target('login'); 
      } 

      // if nothing is returned the transition will continue 
     } 
    } 

]); 

EDIT:getAccess以来

が非同期に実行される - 別の解決策があります:

1.Create親状態は、

$stateProvider.state('authorized', { 
    resolve: { 
     access: function(AuthService) { 
      return AuthService.getAccess(); 
     } 
    } 
}) 

2.Defineそこにあなたの決意を解決入れますあなたの州の親国家

.state('yourSTATE', { 
    ..... 
    parent:  'authorized', 
    .... 
}) 
$遷移の

3.HandleするonSuccess(https://github.com/angular-ui/ui-router/issues/2946)解決されたデータにアクセスして、遷移が私の編集を参照してください別のターゲットに

app.run([ 
    '$transitions', 
    function ($transitions) { 

     $transitions.onSuccess({}, function(transition) { 
      var hasAccess = transition.getResolveValue('access'); 

      if(!hasAccess) { 
       return transition.router.stateService.target('login'); 
      } 
     }); 
    } 
]); 
+0

を成功し、リダイレクトする必要があるかどうかを決定するために、私は前にこのような何かを持っていたが、私はレースでしょう私は、状態がロードされる前に 'getAccess() 'が確実に終了するように解決しました。 – Batman

+0

はい、 'getAccess'は非同期で動作しているので、この場合は動作しません。私はビットを –

+0

@Batmanの解決策を編集し、解決策を更新します - それが助けられているかどうか、それをチェックし、私に知らせてください。 –

関連する問題