路由守卫是指当用户满足了某些要求之后才可以离开或者进入某个页面或者场景的时候使用。比如说只有当用户填写了用户名和密码之后才可以进入首页,比如说用户离开某个页面时明月保存信息提示用户是否保存信息后再离开等操作,控制这些要求的就叫路由守卫。

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]
},
3.Resolve 激活路由守卫(通俗来说就是首先创建一个路由守卫来提前获取组件参数值,其次将参数值再返回给组件视图);
这种守卫在路由激活前触发,一般用来获取激活路由对应视图组件数据使用。
进入视图前,利用该守卫将视图所需数据加载完成,
可以避免网络不好的时候用户进入视图后网络不好造成数据加载不出来的情况出现,
此路由守卫在加载视图前请求好数据后才进入视图。
同样的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路由守卫的更多相关文章

  1. Angular路由守卫 canActivate

    作用 canActivate 控制是否允许进入路由. canActivateChild 等同 canActivate,只不过针对是所有子路由. 关键代码 创建路由守卫 import { Injecta ...

  2. Angular路由守卫 canDeactivate

    目的 离开页面时,做出逻辑判断 以ng-alain的项目为基础做演示 效果如图: 关键代码 定义一个CanDeactivateGuardService export class CanDeactiva ...

  3. Angular 路由守卫

    1. 路由 Angular路由: 可以控制页面跳转:可以在多视图间切换: 2. 路由守卫 Angular路由守卫: 在进入或离开某路由时,用于判断是否可以离开.进入某路由::: return true ...

  4. angular4.0 路由守卫详解

    在企业应用中权限.复杂页多路由数据处理.进入与离开路由数据处理这些是非常常见的需求. 当希望用户离开一个正常编辑页时,要中断并提醒用户是否真的要离开时,如果在Angular中应该怎么做呢? 其实Ang ...

  5. angular路由详解六(路由守卫)

    路由守卫 CanActivate: 处理导航到某个路由的情况. CanDeactivate:处理从当前路由离开的情况. Resole:在路由激活之前获取路由数据. 1.CanActivate: 处理导 ...

  6. Angular路由——路由守卫

    一.路由守卫 当用户满足一定条件才被允许进入或者离开一个路由. 路由守卫场景: 只有当用户登录并拥有某些权限的时候才能进入某些路由. 一个由多个表单组成的向导,例如注册流程,用户只有在当前路由的组件中 ...

  7. Angular 从入坑到挖坑 - 路由守卫连连看

    一.Overview Angular 入坑记录的笔记第六篇,介绍 Angular 路由模块中关于路由守卫的相关知识点,了解常用到的路由守卫接口,知道如何通过实现路由守卫接口来实现特定的功能需求,以及实 ...

  8. Angular入门到精通系列教程(13)- 路由守卫(Route Guards)

    1. 摘要 2. 路由守卫(Route Guards) 2.1. 创建路由守卫 2.2. 控制路由是否可以激活 2.3. 控制路由是否退出(离开) 3. 总结 环境: Angular CLI: 11. ...

  9. Angular 4 路由守卫

    路由守卫 只有当用户已经登录并拥有某些权限时才能进入某些路由 一个有多个表单组成的向导,如注册流程,用户只有在当前组件的组件中填写了满足要求的信息才可以导航到下一个路由 当用户未执行保存操作而试图离开 ...

随机推荐

  1. js获取本机的网络IP地址

    JavaScript是一门脚本语言,是不能操作文件,读取本地信息的,所以想要获取IP,还需要借助后端技术.方法如下: //获取本机的网络ip地址 function jsonpCallback(res) ...

  2. 25.django Model

    django ORM基本配置 django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表 1.修改project数据库配置 (1)settigs.py里面 默认 DAT ...

  3. HashMap中的resize以及死链的情况

    之前我已经写过关于HashMap的内容了:http://www.cnblogs.com/wang-meng/p/7545725.html 我们都知道HashMap是线程不安全的, 如果多线程来访问会有 ...

  4. AJAX跨域问题解决方法(1)——禁止浏览器进行跨域限制

    思路:通过命令行修改浏览器启动参数,使得浏览器不进行跨域检查,从而允许跨域 方法:命令行参数启动浏览器后添加参数--disable-web-security 例:chrome --disable-we ...

  5. centos7上修改主机名

    centos7上修改主机名 2017-10-09   13:45:17 个人原创,转载请注明,否则追究法律责任 1,临时修改: 和centos5,centos6 一样,重启失效 2,永久修改: 命令: ...

  6. 如何实现vue前端跨域,proxyTable解决开发环境前端跨域问题

    在开发环境与后端调试的时候难免会遇到跨域问题,很多人说跨域交给后端解决就好了. 其实不然,前端也有很多方法可以解决跨域,方便也快捷. 常见的有nginx转发.node代理. 在vue项目中常用的是pr ...

  7. 兄弟连PHP培训教你提升效率的20个要点

    兄弟连PHP培训教你提升效率的20个要点 用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则 不会,注意:只有echo能这么做,它是一种可以把多个字 ...

  8. Linux最佳的云存储服务分析

    什么样的云服务才适合作为 Linux 下的存储服务?兄弟连www.itxdl.cn来帮大家分析一下! 大量的免费空间.毕竟,个人用户无法支付每月的巨额款项. 原生的 Linux 客户端.以便你能够方便 ...

  9. Angular-Mobile介绍

    陆续更新中 1. 介绍: * Angular-Mobile是使用Angular和Bootstrap3为手机端网页和App提供支持的前端UI框架.

  10. 【Linux】 CentOS6.5安装Python2.7以及pip等工具

    原文地址 CentOS6.5下是原来就有python的,我的镜像里面自带的python版本是2.6.6.如果想要自己更新一个更加新的python版本可以这么做: 安装python2.7安装包. 从官网 ...