ng4.x 子路由&辅助路由&路由守卫&resolve守卫

# 1 :重定向路由


 {path: '',redirectTo:'home', parthMatch:'full'},

 {path: 'home',component: HomeComponent}


# 2 :子路由


+ 形成插座的父子关系

+ 路由信息都是在模块层的,组件本身并不知道任何路由相关的消息

《app-routing.module.ts》

 {path: 'home',component: HomeComponent ,children:                                                                     [path:'',component:XxxComponent]}


<a [routerLink] = "['./']">商品描述</a>                                                                                        <a

<a [routerLink] = "['./seller', 99]">销售员信息 </a>                                                                      

<router-outlet></router-outlet>


#  3 :辅助路由


E1:在组件的模版上面添加一个带有那么属性的插座

E2:在路由配置里面配置name上可以显示哪些组件

{path:'xxx',component:XxxComponent,outlet:“aux”}

{path:'yyy',component:YyyComponent,outlet:“aux”}

E3:在导航的时候需要指定路由到某个地址的时候,辅助路由上需要显示哪个组件

<a [routerLink] = "['/home' , {outlets:{aux: 'xxx'}}]">Xxx</a>                                                     

<a [routerLink] = "['/product' , {outlets:{aux: 'yyy'}}]">Yyy </a>          

主插座显示home路由对应的组件,辅插座显示xxx路径对应的组件

eg

《app.component.html》

<a [routerLink] = "['/home']">主页</a>                                                                                          

<a [routerLink] = "['/product',1]">商品详情</a>                                                                          

<a [routerLink] = "[{outlets:{aux :'chart'}}]">开始聊天</a>                                          

<a [routerLink] = "[{outlets:{aux :null}}]">结束聊天</a>    

  <router-outlet></router-outlet>    

 <router-outlet name="aux"></router-outlet>

《app-routing.module.ts》:

{path:'chart',component:ChartComponent,outlet:“aux”}

扩:点击开始聊天时主路由跳到home组件

<a [routerLink] = "[{outlets:{primary: 'home',aux: 'chart'}}]">开始聊天</a>


# 4 :路由守卫


只有当用户满足了某些条件时才允许被进入或离开某个路由

如: 只有当用户已经登录并拥有某些权限时才能进入某些路由

E1:CanActivate:处理导航到某路由的情况

E2:CanDeactivate:处理从当前路由离开的情况

E3:Resolve:在路由激活之前获取路由数据

eg 1

login.guard.ts》:

import {CanActivate} from "@angular/router";

export class LoginGuard implements CanActivate {canActivate) {    

            let loggedIn:boolean = Math.random() < 0.5;

            if(!loggedIn) {console.log("用户未登录");}return loggedIn;

}

《app-routing.module.ts》:

{path:'product/:id',component:ProductComponent,children:                                                                 [{path:'seller/:id',component:SellerComponent}],  

            canActivate:[LoginGuard]

//angular 使用依赖注入机制来实例化LoginGuard

@NgModule({  

  ...    

...    

providers: [LoginGuard]

})


eg 2

《unSaved.guard.ts》:

import {CanDeactivate} from "@angular/router";

import {ProductComponent} from "../product/product.component";

export class UnsaveGuard implements CanDeactivate{

             canDeactivate(component: ProductComponent) {  

                             return window.confirm("你还未保存,确定要离开吗?");

}


# 5 :resolve守卫


使用resolve守卫可在进入路由之前先读取服务器数据,然后带着这些数据进入路由,立即在页面显示,避免http请求延时来来的较差的用户体验

eg:

《product.component.ts》

export class Product {constructor (public id: number, public name: string){}}

《product.resolve.ts》:

import {Resolve} from "@angular/router";import {Product} from "../product/product.component";

export  class ProductResolve  implements Resolve{                                                                   @Injectable()constructor(private router : Routert){}resolve (route: ActivatedRouteSnapshot, state:RouterStateSnapshot): observable|Promise|Product{

let productId:number = route.params["id"];

if(productId == 1){

return new Product(1,"iPhone7")

}else{

this.router.navigate(['/home']);

return undefined;

}}}

《app-routing.module.ts》:

{path:'product/:id',component:ProductComponent,children:[

{path:'seller/:id',component:SellerComponent}

],resolve:{

           product: ProductResolve

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容

  • 路由:根据不同地址加载不同组件,实现单页面应用 # 1 路由基础知识 ================= 在ang...
    __凌阅读 633评论 0 0
  • 一:路由基础 什么是路由: 在web开发中,路由的概念由来已久,简而言之,就是利用URL的唯一性来指定特定的事物,...
    真的稻城阅读 5,934评论 2 7
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,097评论 18 139
  • 一.课程简介 (注意:这里的AngularJS指的是2.0以下的版本) AngularJS的优点: 模板功能强大丰...
    壹点微尘阅读 859评论 0 0
  • 一、安装最新版本的 nodejs 注意:请先在终端/控制台窗口中运行命令 node -v 和 npm -v, 来验...
    liuguangsen阅读 1,989评论 0 1