Angular路由传值的四种方式

倾家荡产买入文乃股!!!文乃天外飞仙,唯我文乃(破嗓)!!


《我们无法一起学习》古桥文乃

任你们前十二集蹦来蹦去,我只打我的助攻,在最佳的时机,最佳的地点用最佳的方式开始绝地反杀,大招清场,五杀团灭,直接MVP到手。文乃同学的操作真是天秀666……这些都是因为巧合导致而不是文乃酱是腹黑。话说回来——天降系真是绝杀幼驯染啊。不过天降系不是最猛的,最猛的是天降幼驯!015小草莓你“死”的好惨啊!

开始学习吧!

开始正片吧,例如现在我们有两个组件,一个是新闻列表list.component;另一个是新闻新闻详情detail.component。根据组件的功能我们应该是从新闻列表页面进入详情页面,根据列表中条目的文章ID请求数据调用详细的文章信息然后展示给用户查看。我们如何在列表页把文章ID传给详情页呢?

共有四种方式。确切说是分成两大类共四小类,我给大类定义的名字是主动跳转传值触发跳转传值,两种方式都包含有get跳转和动态路由两种方式来实现,这样也就就是四种了下面一一道来:

前提是我们在app-routing.module.ts中已经添加了相关的路由条目,嗯!我们先不考虑RouterModule.forRoot()RouterModule.forChild()的区别和应用场景,为了方便理解记忆路由传值,在这里这里面我们把所有的路由信息都写到了app-routing.module.ts

// 导入路由模块及组件信息
import { Routes ,  RouterModule } from '@angular/router';
import { ListComponent } from '....';
import { DetailComponent } from '....';

// 定义路由信息
const routes: Routes = [
  {path: 'list', component: ListComponent},
  {path: 'detail', component: DetailComponent},
  {path: '**', redirectTo: 'home'},
];

// 应用路由
@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})

一,主动跳转传值

1:Get方式

newslist.component.html中使用ngfor调用列表,使用routerLink属性来定义跳转路由地址,使用queryParams属性来定义要传递的值。注意值的形式,别搞错了。不管是字符串还是变量都要有" "来包裹,而字符串还要再多一层' '

<!--  newslist.component.html  -->
<ul class="list">
    <li *ngFor="let item of items">
        <!--   使用queryParams属性来传递值  -->
        <a [routerLink]="['/detail']" [queryParams]="{ id:item.ID }">{{item.title}}</a>
    </li>
</ul>

detail.component中使用ActivatedRoute模块的queryParams方法来接受传递过来的数据,需要注意的queryParams是一个RXJS对象需要用subscribe订阅来调用返回值。

/* detail.component.ts
 要先导入ActiveRoute模块 */
import { ActivatedRoute } from "@angular/router"

// 构造函数中实例化
constructor( public route:ActivatedRoute ){ }

// 接收到传递过来的值
this.route.queryParams.subscribe( val:any => {
    console.log('文章ID:',val.id )
})

2:动态路由

部分代码已经省略,可以比较前面的代码。首先需要在路由文件中定义路由信息,这也是get方式和动态路由的区别之一,get方式不用设置路由信息,而动态路由顾名思义是需要设置路由信息的。

路由信息中添加动态路由:

// app-routing.module.ts
// 省略部分见开头的代码 注意形式是 '/:',别写错
  {path: 'detail/:id', component: ListComponent},

然后是路由跳转,不使用queryParams属性跳转,而是routerLink属性传值的时候内部的数组中,这个第二项附带上要传的值(数组下标1)。

<!--  newslist.component.html  -->
    <a [routerLink]="['/detail' , item.id]">{{item.title}}</a>

最后接受发送的数据,这里还是使用ActivatedRoute模块,但是不再使用queryParams方法,而是用params方法,而且params也是一个RXJS对象同样还是要用subscribe订阅来调用返回值。

// detail.component.ts
this.route.params.subscribe( val:any => {
    console.log('文章ID:',val )
})
//  * 注意前面传来的值是对象还是字符串

二:触发跳转传值

1:动态路由

前面所说的例子都是依附于html<a>标签,言外之意就是需要用户来点击才能触发路由跳转,如果使用场景中不需要用户点击而是根据条件判断结果自动跳转,例如判断用户是否已经登录,如果是自动登录状态就让用户自动跳转到指定页面,如果没有就自动跳转到登录页面。这个情况下使用angular的routerLink就会有点力不从心了。

这个时候我们就可以通过封装JS跳转的方法,在判断条件满足时,自动触发该方法即可。既然是触发跳转的路由跳转,那么肯定还是和我们的路由信息有关联,还是在app-routing.module.ts中添加路由信息:

// app-routing.module.ts
// 省略部分见开头的代码 注意形式是 '/:',别写错
  {path: 'detail/:id', component: ListComponent},

我们使用Router模块。注意这个地方别写错了。Routes是路由信息配置的类,ActivatedRoute模块是接受传来数据时用的模块,RouterModule是路由模块,Router模块是JS路由跳转用的模块,有点乱……没关系通过一个表格,有助于我们记忆。

“混乱的route”

// 引入Router 模块
import { Router } from '@angular/router';

使用Routernavigate方法来进行跳转,传递格式和动态路由一样。

// 构造函数中实例化
constructor(private router: Router) {}

// 带传值的JS跳转,注意传值的方式,和动态路由一样。
this.router.navigate(['/detail', item.id]);

// 没有传值的跳转
this.router.navigate(['/home']);
}
}

2:get跳转

这和get方式跳转一样,不需要路由信息的支持,直接传递就可以。不过我们需要额外引入一个NavigationExtras的类来定义传递的信息。

//引入NavigationExtras类
import { Router ,NavigationExtras} from '@angular/router';

定义传参,get跳转传值:

let navigationExtras: NavigationExtras = {
    queryParams: { 'id': item.id },
    fragment: 'anchor'
};
this.router.navigate(['/detail'],navigationExtras);

后记:其实我觉得这篇文章叫路由跳转方式比较贴切,嘿嘿……

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容

  • 路由是 Angular 应用程序的核心,它加载与所请求路由相关联的组件,以及获取特定路由的相关数据。这允许我们通过...
    semlinker阅读 12,176评论 4 16
  • 一、SPA的概念 首先明确一个概念,SPA,全称为Single Page Application单页应用,一个单页...
    耦耦阅读 5,944评论 0 3
  • 官网链接: angular官网 路由与导航最好是跟着官网写一遍代码,然后来看这个总结,会比较清晰 如何实现一个简单...
    H_DaYan阅读 3,223评论 0 6
  • 路由要解决的核心问题是通过建立URL和页面的对应关系,使得不同的页面可以用不同的URL表示。在angular中,页...
    oWSQo阅读 1,290评论 0 1
  • Angular介绍 Angular安装、创建项目、目录结构、组件、服务 创建组件、绑定数据、绑定属性、数据循环、条...
    地瓜粉丝阅读 516评论 0 2