Angular入門到精通系列教程(13)- 路由守衛(Route Guards)

環境:shell

  • Angular CLI: 11.0.6
  • Angular: 11.0.7
  • Node: 12.18.3
  • npm : 6.14.6
  • IDE: Visual Studio Code

1. 摘要

在咱們的實際的業務開發過程當中,咱們常常會遇到以下需求:npm

  1. 須要限制某些 URL 的可訪問性,例如,對於系統管理界面,只有那些擁有管理員權限的用戶才能打開。
  2. 當用戶處於編輯界面時,在沒有保存就離開時,須要提示用戶是否放棄修改。

針對以上場景,Angualr使用路由守衛(Route Guards)來實現。框架

2. 路由守衛(Route Guards)

2.1. 建立路由守衛

Angular CLI提供了命令行工具,能夠快速建立路由守衛框架文件:ng generate guard auth。 執行後,Angular CLI會問咱們須要實現哪些接口,咱們直接勾選便可:ide

? Which interfaces would you like to implement? (Press <space> to select, <a> to toggle all, <i> to invert selection)
>(*) CanActivate
 ( ) CanActivateChild
 ( ) CanDeactivate
 ( ) CanLoad

說明:工具

  1. CanActivate: 控制路由是否能夠激活
  2. CanActivateChild: 控制子路由是否能夠激活
  3. CanDeactivate: 控制路由是否能夠退出
  4. CanLoad: 控制模塊(module)是否能夠被加載

比較常常使用的是一、3,分別控制進入和退出。 按照上面配置,AngularCLI自動生成以下代碼,return true; 替換爲咱們實際的代碼便可。return false; 表示不容許跳轉,或者取消離開當前頁面。this

// auth.guard.ts
import { Injectable } from '@angular/core';
import { CanActivate, CanDeactivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class AuthGuard implements CanActivate, CanDeactivate<unknown> {
  canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
    return true;
  }
}

在canActivate方法中,咱們還可使用跳轉。如頁面判斷是否已經登陸,若是沒有登陸,跳轉到Login頁面:spa

this.router.navigate(['/login']);
return false;

2.2. 控制路由是否能夠激活

控制路由是否能夠激活,須要定義在定義路由的地方,增長canActivate屬性。若是須要,還能夠增長data屬性, 好比告訴咱們的AuthGuard進入當前路由須要驗證哪些權限。data屬性是可選的。命令行

const routes: Routes = [
  {
    path: "page1",
    component: Page1Component,
    data: { permissions: ['YourPage1Permission'] },  // 傳入參數給AuthGuard,可選
    canActivate: [AuthGuard]
  },
  {
    path: "page2",
    component: Page2omponent,
    data: { permissions: ['YourPage2Permission'] },  // 傳入參數給AuthGuard,可選
    canActivate: [AuthGuard]
  }
]

2.3. 控制路由是否退出(離開)

和控制路由是否能夠激活相似,在路由定義出增長 canDeactivate,並制定相應的Guard守衛便可。這裏再也不舉例code

3. 總結

  1. 經過路由守衛(Route Guards)實現控制URL的進入和離開;
  2. Angular CLI能夠輔助咱們建立guard文件;



---------------- END ----------------component






======================

相關文章
相關標籤/搜索