cnzt      

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

事件会在Router对一个路由配置进行惰性加载之前触发。

RouteConfigLoadEnd

事件会在路由被惰性加载之后触发。

NavigationEnd

事件会在导航成功结束之后触发。

NavigationCancel

事件会在导航被取消之后触发。 这可能是因为在导航期间某个路由守卫返回了false

NavigationError

这个事件会在导航由于意料之外的错误而失败时触发。

路由守卫:

   路由守卫通过返回一个boolean值来控制路由器的行为。

  因为守卫的动作可能是异步的(询问用户,server取数据等),所以守卫可以返回Promise或者Observable对象。

  守卫接口:

    •   用CanActivate来处理导航某路由的情况。

    •   用CanActivateChild来处理导航某子路由的情况。

    •   用CanDeactivate来处理从当前路由离开的情况.

    •   用Resolve在路由激活之前获取路由数据。

    •   用CanLoad来处理异步导航到某特性模块的情况。

  守卫以服务的方式定义,并注入到路由配置中。

  


一些概念:

RouterPutlet -- 路由出口

RouterLink -- 路由连接,值是 字符串 或 链接参数数组

RouterLinkActive -- RouterLink的链接被激活时会被加上此属性指定的 classes,反之移除

ActivatedRoute -- 激活的路由

RouterState -- 可以遍历路由树

路由组件 -- 带有router-outlet的组件

Angular 路由⑦要素的更多相关文章

  1. angular路由——ui.route

    angular路由 使用案例 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  2. angular路由详解:

    1.$routeProvider ngRoute模块中的服务 2.otherwise:设置用于路由改变时,与任何其他定义的路由无法匹配的时候执行的代码 3.when:为$route服务定义新的路由 例 ...

  3. angular 路由的引用

    使用angular路由 遇到的坑. 使用cmd 安装好node.js 安装成功 输入node  -v 能查看版本说明安装成功 搭建angular项目输入命令 npm install  -g  angu ...

  4. angular 路由项目例子

    angular 路由是我在工作中体验非常便捷的一点, 这是详细的API ,查看API 可以了解很多东西, https://github.com/angular-ui/ui-router/wiki/Qu ...

  5. Angular路由参数传递

    一.路由时传递参数的方式 1.在查询参数中传递数据 //页面 <a routerLink="/product" [queryParams]="{id:1}" ...

  6. angular路由(自带路由篇)

    一.angular路由是什么? 为了实现SPA多视图的切换的效果,其原理可简述为每个 URL 都有对应的视图和控制器.所以当我们给url后面拼上不同的参数就能通过路由实现不同视图的切换. 二.文件总览 ...

  7. Angular路由守卫 canActivate

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

  8. Angular路由守卫 canDeactivate

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

  9. Angular 路由守卫

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

随机推荐

  1. hihoCoder-1089-Floyd

    我们读入的时候,要考虑重边的问题,我们只取边的最小值就可以了. #include <cstdio> #include <cstring> const int INF = 0x3 ...

  2. 【实用工具】Teleport Pro爬取整个网站镜像到本地

    1. 使用Teleport Pro可以完全或部分下载一个网站上的内容,在硬盘上创建一个与原网站完全相同的镜象,使用户能够离线浏览 Teleport Pro的安装以及基本使用 在菜单栏Project下得 ...

  3. docker系列之基础命令-2

    一.查看本地镜像 docker images 二.需要基础的镜像两种方式 1.docker pull centos 可以直接拉起镜像 2.直接用xshell导入就行,docker load -i  加 ...

  4. vue-music:歌词的其他功能

    由于歌词的播放需要歌曲播放,切换歌曲,歌曲的播放模式等等有关联,因此,需要在这几处处理相关问题 1.循环播放回不到开始位置 loop() { this.$refs.audio.currentTime ...

  5. perl学习之子程序

    一.定义子程序即执行一个特殊任务的一段分离的代码,它可以使减少重复代码且使程序易读.PERL中,子程序可以出现在程序的任何地方.定义方法为:sub subroutine{statements;}二.调 ...

  6. python--第一类对象,函数名,变量名

    一 . 第一类对象 函数对象可以像变量一样进行赋值 , 还可以作为列表的元素进行使用 可以作为返回值返回 , 可以作为参数进行传递 def func(): def people(): print('金 ...

  7. pyhton链式赋值在可变类型/不可变类型上的区别以及其本质

    关于链式赋值的一些注意点: a=[]b=[]x=y=[]print(a==b) #Trueprint(x==y) #Trueprint(a is b) #Falseprint(x is y) #Tru ...

  8. eclipse中新建maven项目无法添加src/main/java问题

    eclipse创建maevn web项目,在选择maven_archetype_web原型后,默认只有src/main/resources这个Source Floder. 按照maven目录结构,添加 ...

  9. PAT Basic 1048

    1048 数字加密 本题要求实现一种数字加密方法.首先固定一个加密用正整数 A,对任一正整数 B,将其每 1 位数字与 A 的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对 13 取余— ...

  10. PYDay1-洗剑

    学习语言的阶段: 第一阶段:所有东西都是新的::一个月 第二阶段:开始懂一些::一个月 第三阶段:感觉自己是不可战胜的:第三~第四个月 第四阶段:突然感觉什么都不知道,开发是无止境的::培训阶段不会遇 ...