资讯专栏INFORMATION COLUMN

Angular 路由

Olivia / 1325人阅读

摘要:要做到这一点,有三个必不可少的步骤,分别是创建根路由模块定义路由配置添加指令标签。下面的代码以路由配置为参数,通过调用方法来创建根路由模块,并将其导入到应用的根模块中。

概述
路由所要解决的核心问题就是通过建立URL和页面的对应关系,使得不同的页面可以用不同的URL来表示。

Angular路由的核心工作流程图

首先,当用户在浏览器上输入URL后,Angular将获取该URL并将其解析生成一个UrlTree实例

其次,在路由配置中寻找并激活与UrlTree实例匹配的配置项

再次,为配置项中指定的组件创建实例

最后,将该组件渲染于路由组件的模板中指令所在的位置

基本用法

Angular路由最为基本的用法是将一个URL所对应的组件在页面中显示出来。要做到这一点,有三个必不可少的步骤,分别是创建根路由模块、定义路由配置、添加指令标签

创建根路由模块

根路由模块包含了路由所需要的各项服务,是路由工作流程得以正常执行的基础。

下面的代码以路由配置rootRouterConfig为参数,通过调用RouterModule.forRoot()方法来创建根路由模块,并将其导入到应用的根模块AppModule中。

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部分的特性

浏览器向服务器发送请求时不会带上hash部分的内容,更换URL的hash部分不会向服务器重新发送请求,这使得在进行跳转的时候不会引发页面的刷新和应用的重新加载

使用该策略,只需要在注入路由服务时使用useHash属性进行显示指定即可

app-routing.module.ts

@NgModule({
  imports: [RouterModule.forRoot(rootRouterConfig, { useHash: true })],
  exports: [RouterModule]
})
HashLocationStrategy 路由跳转

Web应用中的页面跳转,指的是应用响应某个事件,从一个页面跳转到另一个页面的行为。对于Angular构建的单页面而言,页面跳转实质上就是从一个配置项跳转到另一个配置项的行为。

指令跳转

指令跳转通过使用RouterLink指令来完成,该指令接收一个链接参数数组,Angular将根据该数组生成UrlTree实例进行跳转

add
list

第一个参数名可以使用 /、./ 或 ../ 前缀

如果第一个片段用 / 开头,则路由器会从应用的根路由开始查找

如果第一个片段用 ./ 开头或者没有用斜杠开头,路由器就会从当前激活路由开始查找

如果第一个片段以 ../ 开头,则路由器将会向上找一级

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,
  }
];

detail 1 tao1 30 man

在组件中获取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指令或者跳转方法来赋值

>detail limit 10
>detail limit 30

Query参数的获取,需要借助ActivatedRoute服务提供的Observable对象的queryParams来完成。

this.sub2 = this.activatedRouter.queryParams.subscribe(value => {
      console.log(value);
    })

// {limit: "10"}
路由拦截

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/106058.html

相关文章

  • Angular路由导航的7个步骤

    摘要:路由过程的个步骤每次点击链接或浏览器改变时,路由器都会确保应用程序做出相应的反应。一旦所有的都已完成,其返回值是合并的路径的然后路由器继续步骤。你可以使用助记记住路由器经过的步骤的顺序。 路由过程的7个步骤 每次点击链接或浏览器URL改变时,Angular路由器都会确保应用程序做出相应的反应。 为了做到这一点,Angular路由器执行以下7个步骤的顺序: 解析(Parse):它解析...

    BLUE 评论0 收藏0
  • 【CuteJavaScript】Angular6入门项目(1.构建项目和创建路由

    摘要:启动服务,并打开新窗口可简写创建新组件可简写创建新服务创建路由模块其他另外还有很多的命令提供,详细可以查阅官方文档命令。引入路由模块导出路由模块的指令这里需要添加一个数组,并传入,导出让路由器的相关指令可以在中的组件中使用。 本文目录 一、项目起步 二、编写路由组件 三、编写页面组件 1.编写单一组件 2.模拟数据 3.编写主从组件 四、编写服务 1.为什么需要服务 2....

    bergwhite 评论0 收藏0
  • 利用angular4和nodejs-express构建一个简单的网站(四)—angular路由初步

    摘要:为了做到这一点,我创建了一个服务提供商,通过的消息推送来实现。最后声明一个来发送修改过的对象。根组件,创建它并插入宿主页面。路由的作用是在找不到任何路由时,访问组件。定义路由数组后,用装饰器导入,并将路由数组传递给的数组。 上一篇文章对用户发来的注册和登录信息进行了处理,并实现了将注册用户信息插入到mysql数据库的数据表和从mysql数据库的数据表中查询到用户的登录信息并返回用户认证...

    Zhuxy 评论0 收藏0

发表评论

0条评论

Olivia

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<