请说说在Angular中的路由器守卫是什么?它有哪些类型?

94 阅读2分钟

"在Angular中,路由器守卫是一种用于控制导航的机制。它们是用来决定用户是否可以访问某个路由或离开当前路由的工具。路由器守卫可以在路由改变之前,检查条件并根据条件来允许或拒绝导航。路由器守卫是实现应用程序安全性和用户体验的重要部分。

路由器守卫的主要类型包括:

  1. CanActivate: 用于检查用户是否可以激活某个路由。通常用于检查用户的权限或是否已登录。

    import { Injectable } from '@angular/core';
    import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router';
    import { AuthService } from './auth.service';
    
    @Injectable({
      providedIn: 'root'
    })
    export class AuthGuard implements CanActivate {
      constructor(private authService: AuthService, private router: Router) {}
    
      canActivate(
        next: ActivatedRouteSnapshot,
        state: RouterStateSnapshot): boolean {
        if (this.authService.isLoggedIn()) {
          return true;
        }
        this.router.navigate(['/login']);
        return false;
      }
    }
    
  2. CanActivateChild: 用于检查用户是否可以激活子路由。类似于CanActivate,但适用于子路由。

    import { Injectable } from '@angular/core';
    import { CanActivateChild, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
    
    @Injectable({
      providedIn: 'root'
    })
    export class ChildGuard implements CanActivateChild {
      canActivateChild(
        childRoute: ActivatedRouteSnapshot,
        state: RouterStateSnapshot): boolean {
        // 检查条件
        return true;
      }
    }
    
  3. CanDeactivate: 用于检查用户是否可以离开当前路由。通常用于确认用户是否希望放弃正在进行的操作。

    import { Injectable } from '@angular/core';
    import { CanDeactivate } from '@angular/router';
    
    export interface CanComponentDeactivate {
      canDeactivate: () => boolean;
    }
    
    @Injectable({
      providedIn: 'root'
    })
    export class CanDeactivateGuard implements CanDeactivate<CanComponentDeactivate> {
      canDeactivate(
        component: CanComponentDeactivate): boolean {
        return component.canDeactivate ? component.canDeactivate() : true;
      }
    }
    
  4. Resolve: 在路由激活之前获取数据。可以用于在进入路由之前加载必要的数据。

    import { Injectable } from '@angular/core';
    import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
    import { Observable } from 'rxjs';
    import { DataService } from './data.service';
    
    @Injectable({
      providedIn: 'root'
    })
    export class DataResolver implements Resolve<any> {
      constructor(private dataService: DataService) {}
    
      resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> {
        return this.dataService.getData();
      }
    }
    
  5. CanLoad: 用于检查是否可以加载某个路由模块。适用于懒加载的路由模块。

    import { Injectable } from '@angular/core';
    import { CanLoad, Route, UrlSegment } from '@angular/router';
    
    @Injectable({
      providedIn: 'root'
    })
    export class LoadGuard implements CanLoad {
      canLoad(
        route: Route,
        segments: UrlSegment[]): boolean {
        // 检查条件
        return true;
      }
    }
    

路由器守卫在Angular应用中提供了强大的导航控制功能,能够帮助开发者管理用户访问和数据加载,提升用户体验和应用安全性。"