angular路由守卫
路由守卫是指当用户满足了某些要求之后才可以离开或者进入某个页面或者场景的时候使用。比如说只有当用户填写了用户名和密码之后才可以进入首页,比如说用户离开某个页面时明月保存信息提示用户是否保存信息后再离开等操作,控制这些要求的就叫路由守卫。
1.CanActivate 进入路由守卫(通俗来说:创建一个守卫,将要求写入守卫里面,将守卫注入到使用的页面,在路由里面引用这个守卫,)
这种守卫是指用户必须满足某些要求后才可以进入路由。比如注册登录
1.首先建立一个守卫文件guard,在文件里面建一个守卫guard.ts
2.在guard.ts里面定义一个类,这个类实现一个接口CanActivate:这个接口只有一个方法就是canActivate(){}
这个方法返回一个布尔值true或者是false,来决定是否进入路由;
import {CanActivate} from "@angular/router";
export class LoginGard implements CanActivate{
canActivate(){
let loggedIn:boolean=Math.random()<0.5;
if(!loggedIn){
console.log("用户未登录");
}
return loggedIn;
}
}
3.接下来去配置路由:在配置路由的时候呢在路由后面加一个canActivate属性,这个属性的值是一个数组,可以是多个值,这里的多个值是所有路由的守卫,也就是说该路由需要满足的路由守卫有哪些,路由会依次调用这些守卫,只有当满足所有守卫的要求时路由才有效,也就是所有守卫的返回值都为true的时候才可以同过路由守卫。
4.路由配置好了之后需要利用依赖注入来实现这个类。
import {LoginGard} from "./gard/login.gard";
const routes:Routes=[
{path:'',redirectTo:'/home',pathMatch:'full'},
{path:'chat',component:XhatComponent,outlet:'aux'},
{path:'product',component:ProductComponent,children:[
{path:'',component:ProductdescComponent} ,
{path:'seller/:id',component:SellerComponent}
],canActivate:[LoginGard]},
{path:'home/:id',component:HomeComponent},//整个路径被划分成两段变量,一段是路径,一段时参数
{path:'**',component:Code404Component}
];
@NgModule({
imports: [
RouterModule.forRoot(routes)
],
exports:[RouterModule],
providers: [LoginGard]
})
export class AppRoutingModule { }
2.CanDeactivate 离开路由守卫
这种守卫是指用户如果不能满足当前守卫的要求就不能离开此页面
1,同CanActivate一样首先也要顶一个守卫这个守卫实现一个接口CanDeactivate ,不一样的是这个接口要实现一个泛型,这个泛型就是指定当前组件的类型,即要守护的组件;
2.这个接口有一个canDeactivate()的方法,一样要接受一个参数,这个参数是当前保护的组件的参数信息;用这些信息来判断满足什么样的条件方可离开此组件页面
import {CanDeactivate} from "@angular/router";
import {ProductComponent} from "app/product/product.component";
export class UnsaveGuard implements CanDeactivate<ProductComponent>{
canDeactivate(component: ProductComponent){
return window.confirm("您还没有保存确定要离开吗")//如果用户点否就继续留在本页面,点确定才会离开本页面。window.confirm弹出一个弹框
}
}
3.配置路由,和canActivate一样的配置方式
const routes:Routes=[
{path:'',redirectTo:'/home',pathMatch:'full'},
{path:'chat',component:XhatComponent,outlet:'aux'},
{path:'product',component:ProductComponent,children:[
{path:'',component:ProductdescComponent} ,
{path:'seller/:id',component:SellerComponent}
],canActivate:[LoginGard],
canDeactivate:[UnsaveGuard]
},
这种守卫在路由激活前触发,一般用来获取激活路由对应视图组件数据使用。
进入视图前,利用该守卫将视图所需数据加载完成,
可以避免网络不好的时候用户进入视图后网络不好造成数据加载不出来的情况出现,
此路由守卫在加载视图前请求好数据后才进入视图。
同样的1.创建一个路由守卫实现一个接口Resolve,这个接口接受一个泛型,这个泛型
是该守卫要解析出来的数据的结构和类型。
2.实现一个resolve方法,这个方法可以获取路由携带的参数,获取到参数后才可以进
入视图。
import {Injectable} from "@angular/core";
export class ProductRsolve implements Resolve<Product>{//这个product泛型类需要自己定义一下引入
@Injectable()//只有加这个装饰器router才可以被注入进来
constructor(private router:Route){
}
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Product | Observable<Product> | Promise<Product> {//这里的ActivatedRouteSnapshot可以直接获取路由里面的参数,因此接下来就可以直接获取参数值
let productId:number=Route.params["id"];//Route.params直接获取参数
if(productId==){
return new Product(,"iphnoe7");
}else {
this.router.navigate(["/home"]);//注入router后才可以使用导航
}
}
}
export class Product{
constructor(public id:number,public name:string){
}
3.配置路由不一样的是路由里面resolve接收的是一个对象,这个对象的name就是守卫要接受的参数,值就是用哪个守卫来解析这个name。
4.和其他守卫一样也需要注入
const routes:Routes=[
{path:'',redirectTo:'/home',pathMatch:'full'},
{path:'chat',component:XhatComponent,outlet:'aux'},
{path:'product',component:ProductComponent,children:[
{path:'',component:ProductdescComponent} ,
{path:'seller/:id',component:SellerComponent}
],resolve:{
product:ProductRsolve
}
在组件中定义变量接收参数
export class ProductComponent implements OnInit {
routerInfo: any;
private productId:number;//定义两个参数来接收路由传进来的值
private productName:string;
constructor(private routerIonfo:ActivatedRoute) { }
ngOnInit() {
this.productId=this.routerIonfo.snapshot.queryParams["id"];
this.routerInfo.data.subscribe((data:{product:Product})=>{//获取值
this.productId=data.product.id;
this.productName=data.product.name;
});
}
}
export class Product{
constructor(public id:number,public name:string){
}
}
angular路由守卫的更多相关文章
- Angular路由守卫 canActivate
作用 canActivate 控制是否允许进入路由. canActivateChild 等同 canActivate,只不过针对是所有子路由. 关键代码 创建路由守卫 import { Injecta ...
- Angular路由守卫 canDeactivate
目的 离开页面时,做出逻辑判断 以ng-alain的项目为基础做演示 效果如图: 关键代码 定义一个CanDeactivateGuardService export class CanDeactiva ...
- Angular 路由守卫
1. 路由 Angular路由: 可以控制页面跳转:可以在多视图间切换: 2. 路由守卫 Angular路由守卫: 在进入或离开某路由时,用于判断是否可以离开.进入某路由::: return true ...
- angular4.0 路由守卫详解
在企业应用中权限.复杂页多路由数据处理.进入与离开路由数据处理这些是非常常见的需求. 当希望用户离开一个正常编辑页时,要中断并提醒用户是否真的要离开时,如果在Angular中应该怎么做呢? 其实Ang ...
- angular路由详解六(路由守卫)
路由守卫 CanActivate: 处理导航到某个路由的情况. CanDeactivate:处理从当前路由离开的情况. Resole:在路由激活之前获取路由数据. 1.CanActivate: 处理导 ...
- Angular路由——路由守卫
一.路由守卫 当用户满足一定条件才被允许进入或者离开一个路由. 路由守卫场景: 只有当用户登录并拥有某些权限的时候才能进入某些路由. 一个由多个表单组成的向导,例如注册流程,用户只有在当前路由的组件中 ...
- Angular 从入坑到挖坑 - 路由守卫连连看
一.Overview Angular 入坑记录的笔记第六篇,介绍 Angular 路由模块中关于路由守卫的相关知识点,了解常用到的路由守卫接口,知道如何通过实现路由守卫接口来实现特定的功能需求,以及实 ...
- Angular入门到精通系列教程(13)- 路由守卫(Route Guards)
1. 摘要 2. 路由守卫(Route Guards) 2.1. 创建路由守卫 2.2. 控制路由是否可以激活 2.3. 控制路由是否退出(离开) 3. 总结 环境: Angular CLI: 11. ...
- Angular 4 路由守卫
路由守卫 只有当用户已经登录并拥有某些权限时才能进入某些路由 一个有多个表单组成的向导,如注册流程,用户只有在当前组件的组件中填写了满足要求的信息才可以导航到下一个路由 当用户未执行保存操作而试图离开 ...
随机推荐
- 记录一个前端bug的解决过程
人在江湖飘,哪能不挨刀. 我挨了重重一bug.严格来讲这可能是我职业生涯以来的首个悲惨经历,因为凭我的知识储备和经验,基本上任何可重现的bug都是可解的.然而这个bug却困扰了我三个月之久,它具有以下 ...
- 22.jQuery(实例)
1.开关灯效果 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- Asp.Net Boilerplate Project (ABP) 视频教程
转自youtube:https://www.youtube.com/playlist?list=PLlu_PkRHZce-EtuVO1zVQpNgrB7Hiu1vu 虽然全部都没有声音,但看操作还是可 ...
- POST方式提交乱码解决
乱码的问题比较常见,确保各地方的编码格式均统一是保证不出现乱码的必要条件,但还是常会有编码都统一了仍然出现乱码的情况. 第一步: 确认JSP页面头部是否有: <%@ page contentTy ...
- The Problems of Mysql Installation
1.mysql启动报错 解决:查看相关路径的配置文件的basedir.datadir等路径是否正确. 解决:查看报错路径下是否有文件,若没有可找相应文件做软链接,或者/etc/my.cnf部分路径配置 ...
- 在 Scale Up 中使用 Health Check - 每天5分钟玩转 Docker 容器技术(145)
对于多副本应用,当执行 Scale Up 操作时,新副本会作为 backend 被添加到 Service 的负责均衡中,与已有副本一起处理客户的请求.考虑到应用启动通常都需要一个准备阶段,比如加载缓存 ...
- vue简单的自由拖拽
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 剑指Offer-求1+2+3+...+n
package Other; /** * 求1+2+3+...+n * 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句( ...
- 【日记】一次程序调优发现的同步IO写的问题,切记
众所周知,我们在写程序的时候,好习惯是在重要的代码打上日志.以便监控程序运行的性能和记录可能发生的错误. 但是,如果日志是基于同步IO文件操作,那么就必须考虑到访问总次数或并发数目. 如果总次数或并发 ...
- Sqlite库的基本操作
Sqlite 基本操作 打开数据库 sqlite3* SQ_DB; char *zErrMsg = 0; int nRes = sqlite3_open("test.db", &a ...