環境:shell
- Angular CLI: 11.0.6
- Angular: 11.0.7
- Node: 12.18.3
- npm : 6.14.6
- IDE: Visual Studio Code
在咱們的實際的業務開發過程當中,咱們常常會遇到以下需求:npm
針對以上場景,Angualr使用路由守衛
(Route Guards)來實現。框架
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
說明:工具
比較常常使用的是一、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;
控制路由是否能夠激活,須要定義在定義路由的地方,增長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] } ]
和控制路由是否能夠激活相似,在路由定義出增長 canDeactivate
,並制定相應的Guard守衛便可。這裏再也不舉例code
---------------- END ----------------component
======================