设计思路
- 功能分层:将用户权限检查、数据预取等功能分开处理,以便灵活组合和复用。
- 配置驱动:通过配置文件或元数据,定义不同业务模块下的守卫行为,增强灵活性。
- 复用机制:利用Angular的依赖注入,使守卫可在不同模块中共享。
实现步骤
- 创建自定义路由守卫类
import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree, Router } from '@angular/router';
import { Observable } from 'rxjs';
import { AuthService } from './auth.service';
import { DataService } from './data.service';
@Injectable({
providedIn: 'root'
})
export class CustomRouteGuard implements CanActivate {
constructor(private authService: AuthService, private dataService: DataService, private router: Router) {}
canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
// 用户权限检查
const hasPermission = this.authService.hasPermission(route.data['requiredPermission']);
if (!hasPermission) {
this.router.navigate(['/no-permission']);
return false;
}
// 数据预取
if (route.data['preloadData']) {
this.dataService.preloadData(route.data['preloadData']);
}
return true;
}
}
- 定义配置数据
在每个路由配置中添加自定义数据,例如:
const routes: Routes = [
{
path: 'admin/dashboard',
component: AdminDashboardComponent,
canActivate: [CustomRouteGuard],
data: {
requiredPermission: 'admin',
preloadData: 'dashboardData'
}
}
];
- 注册守卫
在
app.module.ts
或相关功能模块的module.ts
中注册守卫:
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { CustomRouteGuard } from './custom-route-guard';
const routes: Routes = [
// 路由配置
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule],
providers: [CustomRouteGuard]
})
export class AppRoutingModule {}
在不同模块中应用
- 模块内使用:在各功能模块的
routes
数组中,为需要守卫的路由添加canActivate: [CustomRouteGuard]
,并根据业务需求在data
中配置权限和预取数据的标识。
- 共享复用:由于守卫是通过
@Injectable({ providedIn: 'root' })
提供在根模块,所以不同模块可以直接复用,无需重复创建。这样可以有效优化整体的路由导航性能,避免重复的权限检查和数据预取逻辑,减少不必要的计算和网络请求。