路由所要解决的核心问题就是经过创建URL和页面的对应关系,使得不一样的页面能够用不一样的URL来表示。
Angular路由的核心工做流程图数组
Angular路由最为基本的用法是将一个URL所对应的组件在页面中显示出来。要作到这一点,有三个必不可少的步骤,分别是建立根路由模块、定义路由配置、添加<router-outlet>指令标签
。浏览器
根路由模块包含了路由所须要的各项服务,是路由工做流程得以正常执行的基础。服务器
下面的代码以路由配置rootRouterConfig为参数,经过调用RouterModule.forRoot()方法来建立根路由模块,并将其导入到应用的根模块AppModule中。app
app-routing.module.ts函数
const rootRouterConfig: Routes = [ { path: 'add', component: AddComponent, }, { path: 'list', component: ListComponent, }, { path: '', redirectTo: 'add', pathMatch: 'full', }, { path: '**', redirectTo: 'add', pathMatch: 'full', } ]; @NgModule({ imports: [RouterModule.forRoot(rootRouterConfig)], exports: [RouterModule] }) export class AppRoutingModule { }
http://localhost:4200/#/add
HashLocationStrategy是Angular路由最为常见的策略,其原理是利用了浏览器在处理hash部分的特性this
浏览器向服务器发送请求时不会带上hash部分的内容,更换URL的hash部分不会向服务器从新发送请求,这使得在进行跳转的时候不会引起页面的刷新和应用的从新加载
使用该策略,只须要在注入路由服务时使用useHash属性进行显示指定便可spa
app-routing.module.ts3d
@NgModule({ imports: [RouterModule.forRoot(rootRouterConfig, { useHash: true })], exports: [RouterModule] })
Web应用中的页面跳转,指的是应用响应某个事件,从一个页面跳转到另外一个页面的行为。对于Angular构建的单页面而言,页面跳转实质上就是从一个配置项跳转到另外一个配置项的行为。code
指令跳转经过使用RouterLink指令来完成,该指令接收一个连接参数数组,Angular将根据该数组生成UrlTree实例进行跳转component
<div [routerLink]="['/add']" routerLinkActive="add" >add</div> <div [routerLink]="['/list']" routerLinkActive="list" >list</div>
第一个参数名可使用 /、./ 或 ../ 前缀
RouterLink指令能够被应用到任何HTML元素上,使得页面跳转不须要依赖超连接。
RouterLink指令经过响应click事件实现页面跳转,若是须要响应其余事件或者根据运行时动态跳转,则能够经过Router.navigateByUrl或Router.navigate来完成。
add() { this.router.navigateByUrl('/add'); } list() { this.router.navigate(['/list']); }
Path参数经过解析URL的path部分来获取参数。
在定义一个配置项的path属性时,可使用/字符来对path属性进行分段,若是一个分段以:字符开头,则URL中与该分段进行匹配的部分将做为参数传递给组件中。
app-routing.module.ts
const rootRouterConfig: Routes = [ { path: 'add/:id/:name/:age/:sex', component: DetailComponent, } ]; <div [routerLink]="['detail', 1, 'tao', 30, 'man']" routerLinkActive="detail">detail 1 tao1 30 man</div>
在组件中获取Path参数,须要导入ActivatedRoute服务,该服务提供了两种方式处理页面之间的跳转。
Angular应用从一个页面跳转到另外一个新的页面,实质就是从一个配置项跳转到另外一个配置项。在这个过程当中,Angular除了会为配置项所对应的组件建立实例外,还会为该配置项建立一个ActivatedRoute实例来表示该配置项已被激活,该ActivatedRoute实例包含一个快照(snapshot),记录了从当前URL解析出来的全部path参数。
ngOnInit() { console.log(this.activatedRouter.snapshot.params); } {id: "1", name: "tao", age: "30", sex: "man"}
Angular在处理同一页面时,不会重现建立组件的实例,因此构造函数和ngOnInit()方法不会被调用。虽然Angular会将快照中参数更新,可是没有将值更新到组件。为了解决这个问题,ActivatedRoute服务提供了一个Observable对象,容许对参数的更新进行订阅。组件销毁的时候要取消订阅。
this.activatedRouter.params.subscribe(value => { console.log(value); }) ngOnDestroy() { this.sub.unsubscribe(); }
因为URL的query部分不用和配置项进行匹配,所以每个配置项能够拥有任意多个查询参数。
http://localhost:4200/list?limit=10
Query参数一样能够经过RouterLink指令或者跳转方法来赋值
<div [routerLink]="['detail']" [queryParams]="{'limit': 10}">>detail limit 10</div> <div [routerLink]="['detail']" [queryParams]="{'limit': 10}">>detail limit 30</div>
Query参数的获取,须要借助ActivatedRoute服务提供的Observable对象的queryParams来完成。
this.sub2 = this.activatedRouter.queryParams.subscribe(value => { console.log(value); }) // {limit: "10"}