Angular 路由⑦要素
http://www.cnblogs.com/zt-blog/p/7919185.html
http://www.cnblogs.com/zt-blog/p/7919185.html
路由⑦要素:
1. 声明 <base herf='' />
以便于路由知道怎么拼接路由path
2. 引入angular的路由模块 RouterModule
RouterModule -- 路由模块
Router -- 路由器
Route -- 路由配置信息, { path: 'crisis-center', component: CrisisListComponent }
Routes -- 是一个Route数组
3.1 配置路由信息, appRoutes描述如何进行导航。
const appRoutes: Routes = [
{ path: 'crisis-center', component: CrisisListComponent }, // 这是一个Route
{ path: 'hero/:id', component: HeroDetailComponent }, //带参数id的路由, e.g. 'hero/18'
{ path: 'heroes', component: HeroListComponent, data: { title: 'Heroes List' } }, //存放路由有关的任何信息(静态只读数据),可被任意激活路由访问。
{ path: '', redirectTo: '/heroes', pathMatch: 'full' }, //重定向。pathMatch指定路径匹配规则,full表示剩下的url必须完全匹配path值,prefix表示剩下的url只要以path值开头即可。
{ path: '**', component: PageNotFoundComponent } ]; //**
路径是一个通配符,前面都不匹配时选此选项。
路由匹配顺序由上至下,按照定义路由的顺序匹配的。
应用庞大时,会专门分出路由模块,多个路由模块引入顺序要注意,每个路由模块也是按照导入的先后顺序插入自己定义的路由。定义了通配符的路由模块一定要放到最后!
Question1: 如何在运行时查看路由器配置?
Answer1:预加载技术异步加载模块
Question2: 传参的几种方式?
Answer2:
1. 路由定义时带参数, { path: 'hero/:id', component: HeroDetailComponent }
2. 导航时, 组件中定义: [RouterLink] = ['/hero', hero.id] // { 15 } 路由器会将这个数组组合成url 'hero/15'
;foo=foo 这样,分号往后并不属于url的一部分,它们仅仅是作为查询参数存在而已!
3. 接参时,通过ActivatedRoute获取:
3.1 导入ActivatedRoute, ParamMap,, 并在构造函数中注入这些服务;
3.2 this.activatedRoute.paramMap 返回所有参数,他是一个可观察对象: 用可观察对象方式获取参数有利于(用不同的参数连续导航到相同组件时)组件的复用!
3.3 paramMap 有四个方法: has(key); get(key); getAll(key); keys();
3.2 配置路由器
@NgModule({
imports: [
RouterModule.forRoot( appRoutes,
{ enableTracing: true } // <-- debugging purposes only //开启此选项后,路由事件会打印到控制台中
)
// other imports here
] , ......
})
根模块的路由用forRoot,子模块的路由用forChild
4. 路由出口----宿主视图
<router-outlet></router-outlet> : 路由控制的视图会根据path显示在这里。
注意: 可以有多个路由出口,但是无名出口最多只能有一个!!!
扩展:
1. 命名出口的路由定义方式如下。path 和 component 之外,还指定了 outlet t出口,表示这个路由会显示在名为 popup 的 router-outlet 中。
{
path: 'compose',
component: ComposeMessageComponent,
outlet: 'popup'
}, ......
2. 向命名路由会出口添加内容: <a [routerLink]="[{ outlets: { popup: ['compose'] } }]">Contact</a> // 需要在链接参数数组中指定这个命名出口
注意: outlets 的属性对象中,也可以指定多个出口,这里只有一个popup。
浏览器的url会像这样: "XXX/superheroes(popup:compose)"
3. 清空命名路由会出口: this.router.navigate([ { outlets: { popup: null } }]); //1. 将名为popup 的 router-outlet 内容清空。2.将url中的(popup:compose)移除。
5. 触发路由导航
5.1 通过a标签/button标签 等可点击的标签触发:
<a routerLink="/tabA" routerLinkActive="active">Tab A</a>
routerLink -- 指定路径
routerLinkActive -- 当前Tab选中时会被加上active class
5.2 通过代码触发:
Router.navigate( [ 链接参数数组 ] )
链接参数也可以用相对路径,如: this.router.navigate(['../', { id: crisisId, foo: 'foo' }], { relativeTo: this.route });
这里使用了相对路径 '../' , 来返回上一级路由父路由。使用相对路径时必须指定当前的ActivatedRoute对象(例子中的 this.route)来提供参考!!!
6. 路由树 -- 路由状态
路由树 ---- 是一个由ActivatedRoute (一个路由服务)组成的树。
Router
服务的属性routerState可以访问当前的RouterState的值。可以由此遍历整个路由树!
7. 路由事件
在一次导航中,Router通过Router.events发布一系列从导航开始到结束的导航事件。
NavigationStart |
本事件会在导航开始时触发。 |
RoutesRecognized |
本事件会在路由器解析完URL,并识别出了相应的路由时触发 |
RouteConfigLoadStart |
|
RouteConfigLoadEnd |
本事件会在路由被惰性加载之后触发。 |
NavigationEnd |
本事件会在导航成功结束之后触发。 |
NavigationCancel |
|
NavigationError |
这个事件会在导航由于意料之外的错误而失败时触发。 |
路由守卫:
路由守卫通过返回一个boolean值来控制路由器的行为。
因为守卫的动作可能是异步的(询问用户,server取数据等),所以守卫可以返回Promise或者Observable对象。
守卫接口:
用
CanActivate
来处理导航到某路由的情况。用
CanActivateChild
来处理导航到某子路由的情况。用
CanDeactivate
来处理从当前路由离开的情况.用
Resolve
在路由激活之前获取路由数据。用
CanLoad
来处理异步导航到某特性模块的情况。
守卫以服务的方式定义,并注入到路由配置中。
一些概念:
RouterPutlet -- 路由出口
RouterLink -- 路由连接,值是 字符串 或 链接参数数组
RouterLinkActive -- RouterLink的链接被激活时会被加上此属性指定的 classes,反之移除
ActivatedRoute -- 激活的路由
RouterState -- 可以遍历路由树
路由组件 -- 带有router-outlet的组件
Angular 路由⑦要素的更多相关文章
- angular路由——ui.route
angular路由 使用案例 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- angular路由详解:
1.$routeProvider ngRoute模块中的服务 2.otherwise:设置用于路由改变时,与任何其他定义的路由无法匹配的时候执行的代码 3.when:为$route服务定义新的路由 例 ...
- angular 路由的引用
使用angular路由 遇到的坑. 使用cmd 安装好node.js 安装成功 输入node -v 能查看版本说明安装成功 搭建angular项目输入命令 npm install -g angu ...
- angular 路由项目例子
angular 路由是我在工作中体验非常便捷的一点, 这是详细的API ,查看API 可以了解很多东西, https://github.com/angular-ui/ui-router/wiki/Qu ...
- Angular路由参数传递
一.路由时传递参数的方式 1.在查询参数中传递数据 //页面 <a routerLink="/product" [queryParams]="{id:1}" ...
- angular路由(自带路由篇)
一.angular路由是什么? 为了实现SPA多视图的切换的效果,其原理可简述为每个 URL 都有对应的视图和控制器.所以当我们给url后面拼上不同的参数就能通过路由实现不同视图的切换. 二.文件总览 ...
- Angular路由守卫 canActivate
作用 canActivate 控制是否允许进入路由. canActivateChild 等同 canActivate,只不过针对是所有子路由. 关键代码 创建路由守卫 import { Injecta ...
- Angular路由守卫 canDeactivate
目的 离开页面时,做出逻辑判断 以ng-alain的项目为基础做演示 效果如图: 关键代码 定义一个CanDeactivateGuardService export class CanDeactiva ...
- Angular 路由守卫
1. 路由 Angular路由: 可以控制页面跳转:可以在多视图间切换: 2. 路由守卫 Angular路由守卫: 在进入或离开某路由时,用于判断是否可以离开.进入某路由::: return true ...
随机推荐
- ios之UITabelViewCell的自定义(xib实现)
通过继承UITableViewCell来自定义cell 1.创建一个空的项目.命名: 2.创建一个UITableViewController 并且同时创建xib: 3.设置AppDelegate.m中 ...
- 【最长连续零 线段树】bzoj1593: [Usaco2008 Feb]Hotel 旅馆
最长连续零的线段树解法 Description 奶牛们最近的旅游计划,是到苏必利尔湖畔,享受那里的湖光山色,以及明媚的阳光.作为整个旅游的策划者和负 责人,贝茜选择在湖边的一家著名的旅馆住宿.这个巨大 ...
- mysql5.6.35源码安装记录
mysql数据库源码安装: 源码地址:wget http://mirrors.163.com/mysql/Downloads/MySQL-5.6/mysql-5.6.xx.tar.gz #安装前准备, ...
- (4)zabbix监控第一台服务器
2. zabbix监控服务器 创建主机,选择模板以及录入基本信息,过一分钟左右,就可以看到cpu.内存.硬盘等等使用情况.本节以图文为主.by the way, zabbix中文翻译很烂,config ...
- RabbitMQ 初体验
概述 RabbitMQ是一款消息队列中间件.他提供了几乎覆盖所有语言的SDK与文档,简直强大的不的了.要详细的去了解学习RabbitMQ,我建议还是看官方文档吧.http://www.rabbitmq ...
- 【java】 field 和 variable 区别及相关术语解释
Having said that, the remainder of this tutorial uses the following general guidelines when discussi ...
- Spark MLlib + maven + scala 试水~
使用SGD算法逻辑回归的垃圾邮件分类器 package com.oreilly.learningsparkexamples.scala import org.apache.spark.{SparkCo ...
- 模板<最小生成树>
转载 最小生成树浅谈 这里介绍最小生成树的两种方法:Prim和Kruskal. 两者区别:Prim在稠密图中比Kruskal优,在稀疏图中比Kruskal劣.Prim是以更新过的节点的连边找最小值,K ...
- WordPress 编辑器没有可视化
第一次安装wordpress后出现文章编辑器只有一行按钮的问题,即使我安装了其他的编辑插件也是一样只有一行, 解决方法: 原来是再Users->All Users 中勾选了Disable the ...
- pytorch遇到的问题:RuntimeError: randperm is only implemented for CPU
由此,我们找到sample.py,第51行如下图修改