2017-12-07 14 views
0

私は基本的なルーティングモジュールを使用して角型アプリケーションを使用しています。以下に私の定義したルートを示します:角度 - 条件付きの経路のみ(ローカルストレージに基づく)

... 
const routes: Routes = [ 
    { path: '', redirectTo: '/home', pathMatch: 'full' }, 
    { path: 'home', component: HomeComponent }, 
    { path: 'register', component: RegisterComponent }, 
    { path: 'login', component: LoginComponent }, 
    { path: 'dashboard', component: DashboardComponent } 
]; 
... 

今私はダッシュボードルートを保護したいと思います。 localStorageという名前のオブジェクトがtokenの場合にのみルーティングします。どうしたらいいですか?

var local = JSON.parse(localStorage.getItem('token')); 

のようなもの:チェックされることになっていた場合 https://angular.io/api/router/CanActivate

canActivateメソッドはboolean型を返すことができます:あなたはCanActivateインタフェースを実装し、ルートガードでそれを行うことができます

... 
const routes: Routes = [ 
    { path: '', redirectTo: '/home', pathMatch: 'full' }, 
    { path: 'home', component: HomeComponent }, 
    { path: 'register', component: RegisterComponent }, 
    { path: 'login', component: LoginComponent }, 
    { path: 'dashboard', checkLogin, component: DashboardComponent } 
]; 
... 
function checkLogin(){ 
    // do the logic 
} 

答えて

1

角度経路ガードを使用する必要があります。

import { CanActivate } from '@angular/router'; 
 

 
class DashBoardGuard implements CanActivate { 
 
    canActivate() { 
 
    if (// your condition) { 
 
     return true; // all fine 
 
    } else {//maybe redirect somwhere} 
 
    } 
 
    
 
} 
 

 
// in your routes 
 
... 
 
{path: 'dashboard', canActivate: {[DashBoardGuard]}

私は複数のルートのためにそれを行うことができますどのようにガード

+0

hereについて詳しく読む:このような? '/ profile'だけでなく、'/dashboard'も保護したいとします。それでは、それぞれのルートごとに関数を書く必要がありますか?どうすればそれをより一般的にすることができますか? – JackSlayer94

+0

'/ dashboard'と'/profile'を保護するロジックが異なっている場合は、明らかにGuardをそれぞれ書く必要があります。しかし、それが同じであれば、既存のガードを再利用することができます。または、ガードが特定の遅延ロードされたモジュールを参照する場合、遅延ローディングを防ぐために親にガードを置くことができます。 –

+0

これはロジックは同じではありません。単一のロジックで両方のルートを扱う方法について上記の例を詳しく説明できますか?私は物事をはっきりとしていない角度に新しいです。 – JackSlayer94

1

を非同期であれば同期的に、または約束/可観測であれば可能です。とにかく、あなたの場合、単にトークンに基づいてtrueまたはfalseを返すようにlocalStorageをチェックしているだけです。

関連する問題