angular 8 配置路由
一、生成路由文件
按照惯例,有一个独立模块来配置相关路由,这个模块类的名字叫做AppRoutingModule,位于src/app下的app-routing.module.ts文件中。
使用CLI生成它。
ng generate module app-routing --flat --module=app
然后查看src/app目录下是否生成成功。
接下来,我们查看生成的文件:
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common'; @NgModule({
imports: [
CommonModule
],
declarations: []
})
export class AppRoutingModule { }
通常不会在路由模块中声明组件,所以可以删除@NgModule.declarations
并删除对 CommonModule
的引用。
二、导出 RouterModule
此刻的AppRoutingModule是这样的:
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router'; @NgModule({
exports: [ RouterModule ]
})
export class AppRoutingModule {}
三、添加路由定义
典型的Angular路由(Route)有两个属性:
1、path:一个用于匹配浏览器地址栏中URL的字符串。
2、component:当导航到此路由时,路由应该创建哪个组件。
如果说你希望当URL为http://localhost:4200/homePage时,首先要导入HomePageComponent;以便在Route中引用它。
如下:
import { NgModule } from '@angular/core';
import {RouterModule, Routes} from "@angular/router";
import {HomePageComponent} from "../home-page/home-page.component"; const routes: Routes = [
{ path: 'homePage', component: HomePageComponent }
];
@NgModule({
exports: [RouterModule]
})
export class AppRoutingModule { }
RouterModule.forRoot()
初始化路由器,并让它开始监听浏览器的地址变化。(添加到 @NgModule.imports
数组中)
imports: [ RouterModule.forRoot(routes) ],
注意:
查看app.module.ts文件中是否有引入AppRoutingModule。
import { AppRoutingModule } from './app-routing/app-routing.module';
imports: [
AppRoutingModule
],
四、添加路由出口
打开AppComponent的模板,把<router-outlet>添加进去,<router-outlet>会告诉路由器要在哪里显示路由的试图。
<router-outlet></router-outlet> // src/app/app.component.html
五、运行项目
查看项目页面,注意你的CLI命令行是否仍在运行:
ng serve
地址栏输入http://localhost:4200,这个时候你会看到地址栏显示着项目的标题,但是并没有显示HomePageComponent中的内容。
六、添加默认路由
方法一:当启动项目时,浏览器的地址栏指向的是网站的根路径。它没有匹配到任何现存路由,因此路由器也不会导航到任何地方。
要让应用自动导航到这个仪表盘,请把下列路由添加到AppRoutingModule.routes数组中。
{ path: '', redirectTo: '/homePage', pathMatch: 'full' },
现在再次访问项目,你会发现地址栏默认会把一个空路径重定向到'/homePage'的路由;并且首页也加载了HomePageComponent。
方法二:
{ path: '**', component:DashboardComponent}
意思就是当路由URL等于’’时,会去加载DashboardComponent组件;所以你运行你的服务端口号:localhost:4200首先加载的就会是这个组件;
**
路径是一个通配符,表示除了以上几种path,任何的路径都会加载DashboardComponent组件,这个记得写在路由配置最后。
七、添加路由链接(routerLink)
不应该让用户只能把路由的 URL 粘贴到地址栏中。他们还应该能通过点击链接进行导航。
添加一个 <nav>
元素,并在其中放一个链接 <a>元素,当点击它时,就会触发一个到 DetailsComponent 的导航。
<div>
home-page works!
<nav>
<a routerLink="/details">点击查看详情</a>
</nav>
</div>
同时需要把DetailsComponent引入到AppRoutingModule中。
点击查看详情这个链接。地址栏变成了/details,并且页面跳转到详情页。
八、添加详情视图(HTML传参)
现在假设我们首页展示的是一个文章列表,然后我们需要点击每一遍文章查看详情;如果说我们要导航到id为11的文章详情视图,类似于http://localhost:4200/heroes/11的URL。
首先打开AppRoutingModule并导入HeroesComponent。
import {HeroesComponent} from "./heroes/heroes.component";
然后把一个参数化路由添加到 AppRoutingModule.routes
数组中,它要匹配指向文章详情视图的路径。
{ path: 'heroes/:id', component: HeroesComponent }
path
中的冒号(:
)表示 :id
是一个占位符,它表示某个特定英雄的 id
。
此刻,路由就准备就绪了。
然后,我们需要修改HTML页面中的文章列表跳转链接,让它们能够通过参数化的路由进行导航到文章详情页面。
<nav>
<a routerLink="/heroes/{{id}}">点击查看文章详情</a>
<!--数组格式传参-->
<a [routerLink]="['/heroes', num]">点击查看文章详情</a>
</nav>
现在我们刷新页面点击查看文章详情,你发现,地址栏已经更改为http://localhost:4200/heroes/11,页面展示也已经跳转到文章详情页面模块。
九、js页面跳转(传参)
当你在AppRoutingModule导入了HeroesComponent,并且把一个参数化路由添加到 AppRoutingModule.routes
数组中。
我们现在需要通过js传参跳转到HeroesComponent(几个常用的方法):
1、先添加下列导入语句:
import { Router } from '@angular/router';//引入
然后把 ActivatedRoute
注入到构造函数中,将它们的值保存到私有变量里:
constructor( private router: Router) { }//注入到构造函数
2、传递路由参数
单参传递
navigate()该方法支持的参数类型和routerLink指令一样,所以它们的作用也是一样的:
this.router.navigate(['heroes', id]);
或者:
this.router.navigate(['heroes']);
多参传递
this.router.navigate(['heroDetail'], {queryParams: {productId: '1',title: 'moon'}
3、我们注意到还有一个:navigateByUrl(),这个叫做绝对路由;
this.router.navigateByUrl('home');
区别:navigateByUrl()和navigate()的区别点是:navigateByUrl不是根据参数来确定路由地址的。
十、从路由参数中提取id
1、先添加下列导入语句:
import { ActivatedRoute } from '@angular/router';
然后把 ActivatedRoute
注入到构造函数中,将它们的值保存到私有变量里:
constructor(
private route: ActivatedRoute,
) {}
ActivatedRoute
保存着到这个 HeroDetailComponent
实例的路由信息。 这个组件对从 URL 中提取的路由参数感兴趣。 其中的 id
参数就是要显示的英雄的 id
。
2、获取路由参数
方法一:
this.route.queryParams.subscribe(queryParams => {
let productId = queryParams.productId;
let title = queryParams.title;
});
方法二:
代码如下:
public params; //公有变量
ngOnInit() {
this.getData();
}
getData() {
this.route.params.subscribe(
params => {
this.params = params;
console.log(this.params);
}
);
}
这样获取的是一个对象,直接获取id就可以了。
方法三:
代码如下:
ngOnInit(): void {
this.getData();
} getData(): void {
const id = +this.route.snapshot.paramMap.get('id');
console.log(id);
}
十一、回到原路
1、先添加下列导入语句:
import { Location } from '@angular/common';
然后把 Location
服务注入到构造函数中,将它们的值保存到私有变量里:
constructor(
private location: Location
) {}
location
是一个 Angular 的服务,用来与浏览器打交道。 稍后,你就会使用它来导航回上一个视图。
2、点击返回页面:
通过点击浏览器的后退按钮,可以回到上一个也买你进入的页面。
把一个后退按钮添加到组件模板的底部,并且把它绑定到组件的 goBack() 方法。
<button (click)="goBack()">go back</button>
在组件类中添加一个 goBack()
方法,利用注入的Location
服务在浏览器的历史栈中后退一步。
goBack(): void {
this.location.back();
}
angular 8 配置路由的更多相关文章
- angular配置路由/子页面+vue配置路由/子页面
1.在vue.js中组件可以复用,然后最近配置了几个子页面 在 这个文件中配置路由,子页面的配置跟其他一样,只不过path不同. routes: [ { path: '/', ...
- Angular配置路由以及动态路由取值传值跳转
Angular配置路由 1.找到 app-routing.module.ts 配置路由 引入组件 import { HomeComponent } from './home/home.componen ...
- Angular routing生成路由和路由的跳转
Angular routing生成路由和路由的跳转 什么是路由 路由的目的是可以让根组件按照不同的需求动态加载不同的组件. 根据不同地址,加载不同组件,实现单页面应用. Angular 命令创建一个配 ...
- Angular学习笔记—路由(转载)
创建路由 1.首先安装 Angular Router.你可以通过运行以下任一操作来执行此操作: yarn add @angular/router # OR npm i --save @angular/ ...
- [SignalR]配置路由
原文:[SignalR]配置路由 注册路由,在代码如下(SignalR 1.*): 脚本修改如下: 但是其官方文档解释是: By default, the route URL which client ...
- angular.js的路由和模板在asp.net mvc 中的使用
angular.js的路由和模板在asp.net mvc 中的使用 我们知道angular.js是基于mvc 的一款优秀js框架,它也有一套自己的路由机制,和asp.net mvc 路由不太一样.as ...
- vue2.0配置路由
配置路由之前,先检查vue版本,(案例适用vue2.0) 采用npm包的形式进行安装. 安装路由依赖:npm install vue-router(代码中,如果在一个模块化工程中使用它,必须要通过 V ...
- flutter 入口文件配置路由+加载页面
入口文件配置路由 1.路由信息 -- 加载页面 ,通常用于显示新的内容或者广告,加载完成之后进入主页面 -- 主页面 /app 2.配置页面 main.dart main.dart // main ...
- Vue2+VueRouter2+webpack 构建项目实战(三):配置路由,运行页面
制作.vue模板文件 通过前面的两篇博文的学习,我们已经建立好了一个项目.问题是,我们还没有开始制作页面.下面,我们要来做页面了. 我们还是利用 http://cnodejs.org/api 这里公开 ...
随机推荐
- 为什么使用css3和div布局?
1,代码精简(没有本身自带的一些属性,容易设置样式)2,解决了table表格的嵌套问题3,速度问题(页面代码减少,增加了编写代码的速度)4 ,对排名的影响,基于xhtml标准的div+css布局会更快 ...
- Authenticator App 两步验证会不会造成亚马逊账号关联?
今天听人说,因为用Authenticator App做亚马逊两步验证造成了帐号关联…… 我给大家解释一下Authenticator的实现原理,作为计算机专业科班出身的我,此次从各方面了解并经过自己亲测 ...
- Grid数字或金额千分位或保留两位小数
formatter: 'number', formatoptions: { thousandsSeparator: "", decimalPlaces: 2 }
- http statusCode(状态码)请求URL返回状态值的含义
http statusCode(状态码)请求URL返回状态值的含义 请求URL浏览器返回状态码的含义(http statusCode): 201-206都表示服务器成功处理了请求的状态代码,说明网页可 ...
- redis 锁的案例
1: redis 锁 作为一种术装饰器使用 基本逻辑: 1:声明一个redislock类 定义生成锁和释放锁两个方法 2:生成锁使用了一个默认值 setnx ; 如果当前时间大于 第一次锁的生成时间 ...
- 将已经存在的项目提交到gitlab的新分支中
将已经存在的项目提交到gitlab中 在gitlab中新增用户jack 登录jack这个git用户,然后创建仓库 mxonline 已经写好了部分功能的项目存放在 D:\>cd D:\pytho ...
- [LeetCode] 326. Power of Three 3的次方数
Given an integer, write a function to determine if it is a power of three. Follow up:Could you do it ...
- Oracle Spatial分区应用研究之一:分区与分表查询性能对比
1.名词解释 分区:将一张大表在物理上分成多个分区,逻辑上仍然是同一个表名. 分表:将一张大表拆分成多张小表,不同表有不同的表名. 两种数据组织形式的原理图如下: 图 1分表与分区的原理图 2.实验目 ...
- java常见集合
集合与数组区别 1-从长度来讲: 数组:需要固定长度. 集合:长度可以改变,可以根据保存的数据进行扩容. 2-从存储内容上: 数组:可以存储基本类型数据,还可以存储引用类型的数据(比如:String ...
- 【Linux】僵尸进程,孤儿进程以及wait函数,waitpid函数(有样例,分析很详细)
本文内容: 1.僵尸进程,孤儿进程的定义,区别,产生原因,处理方法 2.wait函数,waitpid函数的分析,以及比较 背景:由于子进程的结束和父进程的运行是一个异步的过程,即父进程永远无法预测子进 ...