Angular 路由

概述

路由所要解决的核心问题就是经过创建URL和页面的对应关系,使得不一样的页面能够用不一样的URL来表示。

Angular路由的核心工做流程图数组

图片描述

  • 首先,当用户在浏览器上输入URL后,Angular将获取该URL并将其解析生成一个UrlTree实例
  • 其次,在路由配置中寻找并激活与UrlTree实例匹配的配置项
  • 再次,为配置项中指定的组件建立实例
  • 最后,将该组件渲染于路由组件的模板中<router-outlet>指令所在的位置

基本用法

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 { }
  • path 不能以斜杠 / 开头
  • ** 通配符路由,不知足以上路径时,选择此路由

路由策略

HashLocationStrategy

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]
})

HashLocationStrategy

路由跳转

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参数

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();
}

Query参数

因为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"}

路由拦截

相关文章
相关标签/搜索