2017-02-17 2 views
2

私はAngular 1.5.8angular-ui-router 0.3.2を使用しています。 すべてのルート変更で認証方法を解決する必要があります。角度ui-routerは、ルート前に約束を待っています

私はそれは通常、うまく機能している、しかし、私は何度も、アプリケーションが前にルーティングしていることに気づいた App.run

//check permissions 

$rootScope.$on('$stateChangeStart', function (evt, toState) { 
    if ($localStorage.token || toState.authenticated) { 
     $http.defaults.headers.common = { 
      'Authorization': 'Token ' + $localStorage.token, 
      'Accept': 'application/json' 
     }; 

     permissionAPI.me() 
      .then(function(data){ 
       $rootScope.user = data; 
      }) 
      .catch(function(){ 
       if(toState.authenticated) { 
        $rootScope.logout(); 
       } 
      }) 
    } 
    else { 
     if(toState.authenticated) { 
      $rootScope.logout(); 
     } 
    } 
}); 

`

でこれを作成したように、各ルートのresolveプロパティを追加したいいけない

約束permissionAPI.me()が解決され、後でエラーが発生する。

ルートがその約束の直後に有効になるようにするにはどうすればよいですか?

$stateChangeStartからその約束を渡すことで、すべてのルートにメインresolveをどのようにすることができますか?

ありがとうございました!

+0

によって達成されます。これは、約束が開始された後、常に約束されます。約束が解決されたときではありません。これを処理する標準的な方法は、その下にあるすべてのルートに対して 'resolve'を持つ抽象ルートを作成することです。残念なことに、本質的に同期機能として非同期であるPromiseを使用しようとすることは、妥当な解決策ではありません。 – Claies

+0

'$ stateChangeStart'からその約束を関数に解決するにはどうすればいいですか? –

+0

https://github.com/angular-ui/ui-router/wiki/Nested-States-%26-Nested-Views#inherited-resolved-dependencies – Claies

答えて

2

アプリ状態を作成しよう!抽象状態は、アプリケーション全体でデータに一貫してアクセスする必要があるが、そのデータを特定のビューに関連付ける必要がない場合に便利です。

$stateProvider 
     .state('app', { 
      url: '/app/', 
      template: '<div ui-view></div>', 
      controller: 'AppCtrl', 
      abstract: true, 
      resolve: { 
       ActiveUser: function (AuthService) { 
        return AuthService.whoAmI(); 
       } 
      } 
     }) 
     .state('app.home', { 
      url: '', 
      templateUrl: 'app.home.html', 
      controller: 'HomeCtrl', 
      resolve: { 
       Categories: function (ActiveUser, MessagesService) { 
        return MessagesService.getAll(User); 
       } 
      } 
     }); 

その後、限り、あなたのコントローラが'app'の子状態にあるようapp.controller('ExampleCtrl', function (ActiveUser) {});のように、後続の解決ブロックにしたり、コントローラにそのデータにアクセスすることができます。これは、命名規則'app.'

+0

そのように 'toState'を' AuthService'に渡すことは可能でしょうか? –

+0

私はあなたが状態に入ることができるかどうかを解決しようとしていると思いますか? –

+0

'$ stateChangeStart'で' $ rootScope'の 'AppCtrl'に' AuthService.validateRouteAccess(ActiveUser) 'を呼んでいます。それから、私はあなたが別のルートで違った扱いをする(あるいはベースコントローラーですべてを扱う) '$ rootScope.emit( 'Auth.routeUnauthorized'、...)のようにします。 –

関連する問題