环境: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
======================