Angular系列教程之路由守卫

文章目录

    • 前言
    • 路由守卫的类型
    • CanLoad
    • CanActivate
    • CanActivateChild
    • CanDeactivate
    • Resolve
    • 总结

前言

在Angular中,路由守卫是一个非常有用的功能,可以帮助我们控制用户在导航过程中的权限和访问限制。通过使用路由守卫,我们可以拦截导航并根据需求决定是否允许用户继续访问特定的页面或组件。

路由守卫的类型

Angular提供了以下几种类型的路由守卫:

  • CanLoad:进入到当前路由的时候触发(若用户没有权限访问,相应的模块并不会被加载。这里是指对应组件的代码)。

  • CanActivate:用于控制是否允许用户访问目标路由。

  • CanActivateChild:用于控制是否允许用户访问目标路由的子路由。

  • CanDeactivate:用于控制是否允许用户离开当前路由。

  • Resolve:用于在路由激活之前获取必要的数据。

下面我们将逐个介绍这些路由守卫,并给出相应的示例代码。

CanLoad

进入到当前路由的时候触发(若用户没有权限访问,相应的模块并不会被加载。这里是指对应组件的代码)。

下面是一个示例代码,展示如何使用CanLoad守卫来控制访问权限:

import { Injectable } from '@angular/core';
import { CanLoad, Route, Router, UrlSegment } from '@angular/router';@Injectable()
export class CanLoadGuard implements CanLoad {constructor(private router: Router) { }canLoad(route: Route,segments: UrlSegment[]) {// 在这里编写你的权限控制逻辑const isAuthenticated = // 检查用户是否已登录if (isAuthenticated) {return true; // 允许导航} else {// 将用户重定向到登录页面this.router.navigate(['/login']);return false; // 拒绝导航}}}

要使用CanLoad守卫,我们需要将它添加到路由配置中的目标路由上,如下所示:

const routes: Routes = [{path: 'dashboard',component: DashboardComponent,canLoad: [CanLoadGuard]},// 其他路由配置...
];

CanActivate

CanActivate守卫用于控制是否允许用户访问目标路由。当导航发生时,CanActivate守卫将被触发,并根据返回的布尔值来允许或拒绝导航。

下面是一个示例代码,展示如何使用CanActivate守卫来控制访问权限:

import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree, Router } from '@angular/router';
import { Observable } from 'rxjs';@Injectable({providedIn: 'root'
})
export class AuthGuard implements CanActivate {constructor(private router: Router) {}canActivate(route: ActivatedRouteSnapshot,state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {// 在这里编写你的权限控制逻辑const isAuthenticated = // 检查用户是否已登录if (isAuthenticated) {return true; // 允许导航} else {// 将用户重定向到登录页面this.router.navigate(['/login']);return false; // 拒绝导航}}}

在上面的代码中,我们创建了一个名为AuthGuard的服务,并实现了CanActivate接口。在canActivate方法中,我们可以编写自己的权限控制逻辑。如果用户已经登录,我们返回true以允许导航,否则我们将用户重定向到登录页面并返回false拒绝导航。

要使用CanActivate守卫,我们需要将它添加到路由配置中的目标路由上,如下所示:

const routes: Routes = [{path: 'dashboard',component: DashboardComponent,canActivate: [AuthGuard]},// 其他路由配置...
];

CanActivateChild

CanActivateChild守卫用于控制是否允许用户访问目标路由的子路由。它与CanActivate守卫的使用方式类似。

下面是一个示例代码,展示如何使用CanActivateChild守卫来控制访问权限:

@Injectable({providedIn: 'root'
})
export class AuthGuard implements CanActivateChild {constructor(private router: Router) {}canActivateChild(route: ActivatedRouteSnapshot,state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {// 在这里编写你的权限控制逻辑const isAuthenticated = // 检查用户是否已登录if (isAuthenticated) {return true; // 允许导航} else {// 将用户重定向到登录页面this.router.navigate(['/login']);return false; // 拒绝导航}}}

要使用CanActivateChild守卫,我们需要将它添加到路由配置中的目标路由上,如下所示:

const routes: Routes = [{path: 'admin',component: AdminComponent,canActivateChild: [AuthGuard],children: [// 子路由配置...]},// 其他路由配置...
];

CanDeactivate

CanDeactivate守卫用于控制是否允许用户离开当前路由。当用户尝试离开当前路由时,CanDeactivate守卫将被触发,并根据返回的布尔值来允许或拒绝离开。

下面是一个示例代码,展示如何使用CanDeactivate守卫来控制离开权限:

import { Injectable } from '@angular/core';
import { CanDeactivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router';
import { Observable } from 'rxjs';@Injectable({providedIn: 'root'
})
export class DirtyCheckGuard implements CanDeactivate<any> {canDeactivate(component: any,currentRoute: ActivatedRouteSnapshot,currentState: RouterStateSnapshot,nextState?: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {// 在这里编写你的离开权限控制逻辑const isDirty = // 检查当前组件是否有未保存的更改if (isDirty) {return confirm('您有未保存的更改,确定要离开吗?'); // 提示用户是否继续离开} else {return true; // 允许离开}}}

在上面的代码中,我们创建了一个名为DirtyCheckGuard的服务,并实现了CanDeactivate接口。在canDeactivate方法中,我们可以编写自己的离开权限控制逻辑。如果当前组件有未保存的更改,我们将提示用户是否继续离开。

要使用CanDeactivate守卫,我们需要将它添加到路由配置中的目标路由上,如下所示:

const routes: Routes = [{path: 'profile',component: ProfileComponent,canDeactivate: [DirtyCheckGuard]},// 其他路由配置...
];

Resolve

Resolve守卫用于在路由激活之前获取必要的数据。它可以帮助我们在加载组件之前获取所需的数据,以便在组件内部使用。

下面是一个示例代码,展示如何使用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> | Promise<any> | any {// 在这里编写你获取数据的逻辑return this.dataService.getData();}}

在上面的代码中,我们创建了一个名为DataResolver的服务,并实现了Resolve接口。在resolve方法中,我们可以编写自己的获取数据逻辑。在本例中,我们使用DataService服务来获取数据。

要使用Resolve守卫,我们需要将它添加到路由配置中的目标路由上,如下所示:

const routes: Routes = [{path: 'data',component: DataComponent,resolve: {data: DataResolver}},// 其他路由配置...
];

在上述代码中,我们将DataResolver添加到resolve属性中。这将确保在加载DataComponent之前先获取数据。

总结

路由守卫是Angular中一个非常有用的功能,可以帮助我们控制用户在导航过程中的权限和访问限制。通过使用CanLoad、CanActivate、CanActivateChild、CanDeactivate和Resolve守卫,我们可以实现各种导航控制需求,并为用户提供更好的体验。

示例代码仅为演示目的,你可以根据自己的需求进行修改和扩展。希望本文能够帮助你理解和使用Angular的路由守卫功能!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/629872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python PyQt5的学习

一、安装与配置 1、环境&#xff1a; python3.7 2、相关模块 pip install pyqt5 pyqt5-tools pyqt5designer 可以加个镜像 -i https://pypi.tuna.tsinghua.edu.cn/simple3、配置设计器 python的pyqt5提供了一个设计器&#xff0c;便于ui的设计 界面是这样的&#xff1a…

MFC为资源对话框添加消息处理函数和初始化控件

现在我VC6新建了一个对话框工程&#xff1b;又在资源添加了一个新的对话框&#xff0c;并为新的对话框添加了名为CTestDlg的类&#xff1b; 在主对话框的cpp文件包含#include "TestDlg.h"&#xff1b; 在主对话框的cpp文件的OnInitDialog()成员函数中&#xff0c;添…

单列的堆叠柱状图

目的 MSingleColumnStackBarChart类被设计用于创建只有单列的堆叠柱状图&#xff0c;用于血糖数据的统计。以下是封装这个类的目的的详细描述&#xff1a; 抽象复杂性&#xff1a; 通过创建MSingleColumnStackBarChart类&#xff0c;你将复杂的MPAndroidChart库的使用和配置封…

React全局状态管理

redux是一个状态管理框架&#xff0c;它可以帮助我们清晰定义state和处理函数&#xff0c;提高可读性&#xff0c;并且redux中的状态是全局共享&#xff0c;规避组件间通过props传递状态等操作。 快速使用 在React应用的根节点&#xff0c;需要借助React的Context机制存放整个…

mobi文件怎么转换成pdf?

mobi文件怎么转换成pdf&#xff1f;在数字化时代&#xff0c;电子书籍成为了越来越受欢迎的阅读方式。我们可以通过多种格式的电子书来获取知识和娱乐&#xff0c;其中一种常见的格式就是Mobi文件。Mobi文件是亚马逊公司开发的一种电子书格式&#xff0c;它主要用于Kindle设备和…

SL4010升压恒压电源芯片DC3.7V升压5V、12V、24V/5A

SL4010是一款升压恒压电源芯片&#xff0c;可以将DC3.7V的输入电压升压至5V、12V或24V的输出电压&#xff0c;并可提供高达5A的输出电流。这款芯片采用了先进的升压技术&#xff0c;能够实现高效、稳定的电压转换&#xff0c;同时还具有低噪声、低功耗和低成本等优点。在各种需…

【论文阅读】Consistency Models

文章目录 IntroductionDiffusion ModelsConsistency ModelsDefinitionParameterizationSampling Training Consistency Models via DistillationTraining Consistency Models in IsolationExperiment Introduction 相比于单步生成的模型&#xff08;例如 GANs, VAEs, normalizi…

推荐几个Github高星GoLang管理系统

在Web开发领域&#xff0c;Go语言&#xff08;Golang&#xff09;以其高效、简洁、高并发等特性逐渐成为许多开发者的首选语言。有许多优秀的Go语言Web后台管理系统&#xff0c;这些项目星星众多&#xff0c;提供了丰富的功能和良好的代码质量。本文将介绍一些GitHub高星的GoLa…

学会这个昼夜系统,你也能做出一款饥荒生存类游戏DEMO!

学会这个昼夜系统&#xff0c;你也能做出一款饥荒生存类游戏DEMO&#xff01; 《饥荒》作为生存类游戏的老大哥&#xff0c;深受大家喜爱&#xff0c;这款游戏于2012年年底正式公测上线&#xff0c;距今已有10年的时间&#xff0c;从最初的单机版慢慢推出了联机版&#xff0c;…

Android平台Unity下如何通过WebCamTexture采集摄像头数据并推送至RTMP服务器或轻量级RTSP服务

技术背景 我们在对接Unity下推送模块的时候&#xff0c;遇到这样的技术诉求&#xff0c;开发者希望在Android的Unity场景下&#xff0c;获取到前后摄像头的数据&#xff0c;并投递到RTMP服务器&#xff0c;实现低延迟的数据采集处理。 在此之前&#xff0c;我们已经有了非常成…

大模型学习之书生·浦语大模型5——基于LMDeploy大模型量化部署实践

目录 大模型部署背景 LMDeploy部署 量化 TurboMind API server 动手实践环节

LCR 173. 点名(二分)

一、题目描述 LCR 173. 点名 某班级 n 位同学的学号为 0 ~ n-1。点名结果记录于升序数组 records。假定仅有一位同学缺席&#xff0c;请返回他的学号。 示例 1: 输入: records [0,1,2,3,5] 输出: 4示例 2: 输入: records [0, 1, 2, 3, 4, 5, 6, 8] 输出: 7 二、题目解析…

flink1.14.5使用CDH6.3.2的yarn提交作业

使用CDH6.3.2安装了hadoop集群&#xff0c;但是CDH不支持flink的安装&#xff0c;网上有CDH集成flink的文章&#xff0c;大都比较麻烦&#xff1b;但其实我们只需要把flink的作业提交到yarn集群即可&#xff0c;接下来以CDH yarn为基础&#xff0c;flink on yarn模式的配置步骤…

Resemble Enhance音频失真损坏修复AI工具:一个开源语音超分辨率AI模型

Resemble Enhance是一款强大的音频处理工具&#xff0c;可以将嘈杂的录音转化为清晰而有力的声音&#xff0c;为用户提供更优质的听觉体验。这个工具不仅可以有效去除录音中的各种噪声和杂音&#xff0c;还能够恢复音频失真并扩展音频带宽&#xff0c;使原本的声音听起来更加清…

高级分布式系统-第10讲 分布式控制系统

高级分布式系统汇总&#xff1a;高级分布式系统目录汇总-CSDN博客 自动化是关于一切人造系统自动、智能、自主、高效和安全运行的科学与技术 计算机控制技术是实现自动化的主要方法和手段 分布式控制技术是伴随着机器大工业生产而诞生的特殊计算机控制技术 计算机控制系统 …

Qt/QML编程之路:使用camera摄像头(35)

汽车应用中,camera起到了越来越多的作用,数字化的作用,这点无可争议,而作为GUI设计工具,如何让Camera类的应用能更好的发挥作用呢? You can use Camera to capture images and movies from a camera, and manipulate the capture and processing settings that get appl…

网站防御爬虫攻击有哪些方式

很多网站都深受爬虫困扰&#xff0c;网站在被爬虫大量抓取的的时候经常容易被爬虫把服务器资源抓崩了&#xff0c;有的时候&#xff0c;同行也会来爬取我们网站进行数据采集&#xff0c;影响我们站点的原创性&#xff0c;那么如何进行相对应的防护还是非常重要的&#xff01; …

mysql新增用户密码控制局域网访问权限

方法一、通过navicat中sql语句新增 CREATE USER usernamelocalhost IDENTIFIED BY password; GRANT ALL PRIVILEGES ON *.* TO usernamelocalhost WITH GRANT OPTION; FLUSH PRIVILEGES;把其中的username和password改成自己的即可 如果将上面的localhost改成%&#xff0c;则这…

从CISC到RISC-V:揭开指令集的面纱

对于大多数同学来说&#xff0c;计算机或智能手机的运行似乎就像魔法一样神奇。你可能知道它们内部都是一些复杂的电子组件&#xff0c;比如CPU、内存等等&#xff0c;但这些组件是如何协同工作&#xff0c;让我们可以在电脑上打字&#xff0c;或者在手机上看视频呢&#xff1f…

1.环境部署

1.虚拟机安装redhat8系统 这个其实很简单&#xff0c;但是有一点小细节需要注意。 因为我的电脑是 16核心的&#xff0c;所以选择内核16&#xff0c;可以最大发挥虚拟机的性能 磁盘选择SATA&#xff0c;便于后期学习 将一些没用的设备移除 选择安装redhat 8 时间选择上海 选择…