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 路由守卫
路由守卫 只有当用户已经登录并拥有某些权限时才能进入某些路由 一个有多个表单组成的向导,如注册流程,用户只有在当前组件的组件中填写了满足要求的信息才可以导航到下一个路由 当用户未执行保存操作而试图离开 ...
随机推荐
- Chrome游览器使用时,修改文件和网页刷新后,不能显示效果
一:因为游览器缓存问题 有时候在写完代码后,刷新游览器,发现自己写的目标是让某一个东西隐藏,但是结果是依旧显示着,打开调试工具在Sources中发现,文件依旧是上次的旧的文件,新文件没有加载进去,无论 ...
- EasyUI Parser 解析器
Parser(解析器)应用场景 1,自动调用parser 只要我们书写相应的class,easyui就能成功的渲染页面,这是因为解析器在默认情况下,会在dom加载完成的时候($(docunment). ...
- oracle、instantclient以及plsql安装包
链接:http://pan.baidu.com/s/1skZidWT 密码:l1hq
- Pandas与Matplotlib基础
pandas是Python中开源的,高性能的用于数据分析的库.其中包含了很多可用的数据结构及功能,各种结构支持相互转换,并且支持读取.保存数据.结合matplotlib库,可以将数据已图表的形式可视化 ...
- 【阿里聚安全·安全周刊】500万台Android设备受感染|YouTube封杀枪支组装视频
本周的七个关键词: 500万Android 设备受感染丨 黑客将矛头指向无线传输协议 丨 YouTube封杀枪支视频 丨 AMD将发布补丁 丨 Gooligan Android 僵尸网络 丨 N ...
- poj-1005-l tanink i need a houseboat
Description Fred Mapper is considering purchasing some land in Louisiana to build his house on. In t ...
- C#内存泄漏--event内存泄漏
内存泄漏是指:当一块内存被分配后,被丢弃,没有任何实例指针指向这块内存, 并且这块内存不会被GC视为垃圾进行回收.这块内存会一直存在,直到程序退出.C#是托管型代码,其内存的分配和释放都是由CLR负责 ...
- echarts地图的引用
最近是跟echarts杠上了 所在公司是搞数据的 所以身为前端的我 就必须使用echarts将数据展示出来 ,进公司一周 ,前前后后大概用了八九种echarts图,我举得最难的就是引用的地图,因为刚开 ...
- 【Android】带进度条的WebView
http://www.cnblogs.com/over140/archive/2013/03/07/2947721.html
- web语义化之SEO和ARIA
在快速理解web语义化的时候,只知道web语义化有利于SEO和便于屏幕阅读器阅读,但并不知道它是如何有利于SEO和便于阅读器阅读的,带着这个疑问,进行了一番探索总结. SEO 什么是SEO? SEO( ...