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 路由守卫
路由守卫 只有当用户已经登录并拥有某些权限时才能进入某些路由 一个有多个表单组成的向导,如注册流程,用户只有在当前组件的组件中填写了满足要求的信息才可以导航到下一个路由 当用户未执行保存操作而试图离开 ...
随机推荐
- 在开启kerberos 后,hbase存在数据命名空间的问题(解决方案)
用hbase的超级用户 su - hbasekinit -kt /etc/security/keytabs/hbase.headless.keytab hbase-bigdata@STARYEA.CO ...
- git团队协作
hi,team,我们目前使用的是git做项目管理,它是非常优秀的版本控制工具,使用好可以极大提高我们团队开发效率.但是,出现不必要的冲突和代码丢失就要费时解决这些可避免的问题. git开发流程 这个流 ...
- python 重要的日志模块logging
一,logging模块简介 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等:相比print,具备如下优点: 可以通过设置不同 ...
- 3.21li = [1,'a','b',2,3,'a'] # li[1] = 'dfasdfas' # print(li)
一.增:li = [1,'a','b',2,3,'a']#按照索引去增加 li.insert(0,55) print(li) #增加到最后面 li.append('aaa') li.append([1 ...
- 理解Spring中的IOC和AOP
我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式 IOC就是典型的工厂模式,通过ses ...
- 使用axios向后端传递数据,后端接收不到?
开始使用axios的时候,按照官网的例子请求后端接口,遇到了后端接收不到数据的情况. 翻看了文档也没找到解决方法.先来了解下基本的axios 想要使用axios,需要先安装 npm install a ...
- NGINX压力测试
目录 1 硬件配置 3 1.1 型号 3 1.2 CPU 3 1.3 内存 3 2 软件环境 3 2.1 操作系统 3 2.2 ...
- NGUI_Label
五.Label是标签,一般是用来显示文字使用,当然NGUI的扩展性很强,可以通过添加相关的控件组成组合控件来进行复杂功能的使用. 1. 设置字体:可以设置NGUI中的字体,也可以设置Unity中的字体 ...
- MySQL——delete 和 truncate 以及 drop 区别
delete 和 truncate 以及 drop 区别 (个人理解,如有错误,请指出) delete < truncate < drop 删除方式: truncate 只删除数据.逐条 ...
- 笔记:XML-解析文档
要处理XML文档,就要先解析(parse)他,解析器时这样一个程序,读入一个文件,确认整个文件具有正确的格式,然后将其分解成各种元素,使得程序员能够访问这些元素,Java库提供了两种XML解析器: 像 ...