Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

sjqq 2021-08-30 原文

上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由

  为了编写样式方便,我们这篇文章开始引入第三方的css库materializecss,引入方法直接在index.html中普通引用就可以了

  众所周知,Angular出现的目的就是解决web编程的一些限制,让我们编写的网页能像App一样运作,我们现在称之为单页面应用(SPA),单页面应用程序有诸多好处,譬如页面响应快,良好的前后端分离,对服务器压力小等等,当然也有不利于SEO等缺点。

  而实现SPA最重要的那当然是路由,Angular2提供的路由可以让我们在页面间随意的切换而不用刷新页面,下面开始我们的路由之旅

  假设你已经跟上了我们的进度,那就在src/app目录下建立一个app.routing.ts的文件,代码如下

  

复制代码

  1. import {RouterModule,Routes} from "@angular/router";
  2. import {NgModule} from "@angular/core";
  3.  
  4. import { AppComponent } from \'./app.component\';
  5. import { ArticleComponent } from \'./article/article.component\';
  6. import { ArticledetailComponent } from \'./articledetail/articledetail.component\';
  7.  
  8. const routes:Routes=[
  9. { path: \'home\',component: AppComponent},
  10. { path: \'article\',component: ArticleComponent},
  11. { path: \'articledetail/:id\',component: ArticledetailComponent},
  12. { path: \'\',redirectTo:"/home",pathMatch: \'full\'}
  13. ];
  14.  
  15. @NgModule({
  16. imports: [ RouterModule.forRoot(routes) ],
  17. exports: [ RouterModule ]
  18. })
  19. export class AppRoutingModule {}

复制代码

  让我们来看看这个app.routing.ts干了什么事情

  首先我们需要使用语句 import {RouterModule,Routes} from “@angular/router”; 导入我们的路由模块RouterModule以获取路由的支持,然后导入了Routes,这是一个路由的配置数组,我们需要使用它来配置我们的路由

  接下来我们将我们的组件都导入了进来,使用一个Routes类型的变量去配置路由,方式就如上所写,其中我们看到{ path: \’articledetail:id\’,component: ArticledetailComponent},中的id,这种路由的访问链接就是http://****.com/articledetail/id

  最后,我们使用NgModule装饰器去描述导入和导出的情况,这样,我们的路由表就配置好了,只要在app.module.ts中导任意就可以使用了,顺便细心的朋友可能发现了,我们将BlogService也放到这里去,这样,我们在任意地方都可以使用BlogService了。

复制代码

  1. import { BrowserModule } from \'@angular/platform-browser\';
  2. import { NgModule } from \'@angular/core\';
  3. import { FormsModule } from \'@angular/forms\';
  4. import { HttpModule } from \'@angular/http\';
  5. import { AppRoutingModule } from \'./app.routing\';
  6.  
  7. import {BlogService} from \'./data/blog.service\';
  8.  
  9. import { AppComponent } from \'./app.component\';
  10. import { ArticleComponent } from \'./article/article.component\';
  11. import { ArticledetailComponent } from \'./articledetail/articledetail.component\';
  12.  
  13.  
  14. @NgModule({
  15. declarations: [
  16. AppComponent,
  17. ArticleComponent,
  18. ArticledetailComponent
  19. ],
  20. imports: [
  21. BrowserModule,
  22. FormsModule,
  23. HttpModule,
  24. AppRoutingModule
  25. ],
  26. providers: [BlogService],
  27. bootstrap: [AppComponent]
  28. })
  29. export class AppModule { } 

复制代码

  那么具体要怎么使用路由呢?

  上面配置显示我们将AppComponent组件作为了路由起点,那我们就在这个组件里面做些事情

  App.Component.html

  

  1. <div class="container">
  2. <a routerLink="/article" class="btn waves-effect waves-light">博客列表</a>
  3. <a routerLink="/articledetail/1" class="btn waves-effect waves-light">最多阅读</a>
  4. </div>
  5. <router-outlet></router-outlet>

  我们看到有两个新东西,一个是routerLink,这个就像我们原本的a标签的href,是指定Angular路由的一个东西

  第二个就是router-outlet标签,这个是个导航容器,导航过后,新的组件将会在这里展现

  修该过后,我们需要修改articleDetailComponent的代码以支持路由传参的id

  articldetail.component.ts

  

复制代码

  1. import { Component, OnInit,Input } from \'@angular/core\';
  2. import {ActivatedRoute,Params} from \'@angular/router\';
  3. import { Location } from \'@angular/common\';
  4. import {BLOGS,Blog} from \'../data/blog\';
  5. import {BlogService} from \'../data/blog.service\'
  6.  
  7. import \'rxjs/add/operator/switchMap\';
  8.  
  9. @Component({
  10. selector: \'article-detail\',
  11. templateUrl: \'./articledetail.component.html\',
  12. styleUrls:[\'./articledetail.component.css\']
  13. })
  14.  
  15. export class ArticledetailComponent implements OnInit {
  16. @Input() blog:Blog;
  17. constructor(
  18. private bService: BlogService,
  19. private route: ActivatedRoute,
  20. private location: Location
  21. ) {}
  22.  
  23. ngOnInit() {
  24. let id=this.route.params
  25. .switchMap((params: Params) => params[\'id\'])
  26. .subscribe(x=>this.blog=this.bService.getSelectedBlog(+x))
  27. }
  28. back()
  29. {
  30. this.location.back();
  31. }
  32. }

复制代码

  我们添加了ActivatedRoute,Params用以获取路由参数,由于Angular的路由参数是一个Observable对象,我们使用switchMap去处理它,你现在不用去关心这些,因为,在之后的学习中,我们会专门学习Observable

  然后我们添加了一个返回方法,点击就可以返回上一级

  看html代码

  

复制代码

  1. <div class="articledetail" *ngIf="blog">
  2. <h2>文章明细</h2>
  3. <div class="content">
  4. <div class="row">
  5. <span >ID</span>
  6. <span>{{blog.id}}</span>
  7. </div>
  8. <div class="row">
  9. <span >Title</span>
  10. <input type="text" class="myInput" [(ngModel)]="blog.title"/>
  11. </div>
  12. <div class="row">
  13. <button class="btn" (click)="back()">返回列表</button>
  14. </div>
  15. </div>
  16. </div>

复制代码

 

  这样,我们的明细就可以显示了。

  程序到此还不完全,我们当然还要处理下ArticleComponnet组件,改动很少,只用改动一点儿html代码就行了

  article.component.html

  

复制代码

  1. <div class="article">
  2. <ul class="articleList">
  3. <li *ngFor="let blog of blogList" [routerLink]="[\'/articledetail\',blog.id]" >
  4. <a>
  5. {{blog.id}}:{{blog.title}}
  6. </a>
  7. </li>
  8. </ul>
  9. <div>
  10. </div>

复制代码

  这里使用的[routerLink]=[]的方式,第一个是路由地址,第二个是参数,就是我们的id

  处理完了,我们可以来看看效果了

  

  看到这里,你是否觉得有点。。。生硬,那么我们来为路由加一点儿动画

  我们只处理下articleDetail组件

  

复制代码

  1. import { Component, OnInit,Input ,HostBinding,
  2. trigger, transition, animate,
  3. style, state } from \'@angular/core\';
  4. import {ActivatedRoute,Params} from \'@angular/router\';
  5. import { Location } from \'@angular/common\';
  6. import {BLOGS,Blog} from \'../data/blog\';
  7. import {BlogService} from \'../data/blog.service\'
  8.  
  9. import \'rxjs/add/operator/switchMap\';
  10.  
  11. @Component({
  12. selector: \'article-detail\',
  13. templateUrl: \'./articledetail.component.html\',
  14. styleUrls:[\'./articledetail.component.css\'],
  15.  
  16. animations: [
  17. trigger(\'routeAnimation\', [
  18. state(\'*\',
  19. style({
  20. opacity: 1,
  21. transform: \'translateX(0)\'
  22. })
  23. ),
  24. transition(\':enter\', [
  25. style({
  26. opacity: 0,
  27. transform: \'translateY(-100%)\'
  28. }),
  29. animate(\'0.2s ease-in\')
  30. ]),
  31. transition(\':leave\', [
  32. animate(\'.5s ease-out\', style({
  33. opacity: 0,
  34. transform: \'translateY(100%)\'
  35. }))
  36. ])
  37. ])
  38. ]
  39. })
  40.  
  41. export class ArticledetailComponent implements OnInit {
  42. @HostBinding(\'@routeAnimation\') get routeAnimation() {
  43. return true;
  44. }
  45.  
  46. @HostBinding(\'style.display\') get display() {
  47. return \'block\';
  48. }
  49.  
  50. @HostBinding(\'style.position\') get position() {
  51. return \'absolute\';
  52. }
  53. @Input() blog:Blog;
  54. constructor(
  55. private bService: BlogService,
  56. private route: ActivatedRoute,
  57. private location: Location
  58. ) {}
  59.  
  60. ngOnInit() {
  61. let id=this.route.params
  62. .switchMap((params: Params) => params[\'id\'])
  63. .subscribe(x=>this.blog=this.bService.getSelectedBlog(+x))
  64. }
  65. back()
  66. {
  67. this.location.back();
  68. }
  69. }

复制代码

  这里不打算讲解Animate,因为,之后我们会专门介绍Angular2的动画

  现在这里放一个空的链接:Angular2入门系列教程:Angular2动画

  来看看效果吧

  

 

  文章的介绍就到这里,有疑问可以给我留言

  更新ing。。。


  项目已经放到了gitbub上,地址 https://github.com/SeeSharply/LearnAngular

  本文章的提交 https://github.com/SeeSharply/LearnAngular/tree/bba4d45b63621a7fc8fd556aa1fc49d397a00552

 

https://blog.csdn.net/xwnxwn/article/details/81840194

发表于
2019-05-07 15:09 
山涧清泉 
阅读(213
评论(0
编辑 
收藏 
举报

 

版权声明:本文为sjqq原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/sjqq/p/10825579.html

Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数的更多相关文章

  1. Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

    上一篇:Angular2入门系列教程-服务   上一篇文章我们将Angular2的数据服务分离出来,学习了An […]...

随机推荐

  1. Python小白__网络层级

    Python小白__网络分析          刚刚开始接触Python,为了怕遗忘,所以写个博文方便自己回顾 […]...

  2. 夯实Java基础系列12:深入理解Java中的反射机制

    本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 https:/ […]...

  3. MySQL中Exists和In的使用

    Exists关键字: exists表示存在,是对外表做loop循环,每次loop循环再对内表(子查询)进行查询 […]...

  4. [线段树系列] 线段树优化建图

    这一篇讲线段树优化建图。 发现网上关于线段树优化建图的博客很少而且讲的不是很详细,很多人会看得比较懵。 于是原 […]...

  5. Oracle数据库的基本查询

    本文用的是Oracle 10g数据库,利用PL/SQL Developer的集成开发环境(安装可以自行百度) […]...

  6. 朝圣Java(问题集锦)之:The Apache Tomcat installation at this directory is version 8.5.32. A Tomcat 8.0 inst

    最近开始学Java了。有C#底子,但是学起来Java还是很吃力,感觉别人架好了各种包,自己只要调用就行了,结果 […]...

  7. ps批量给gif图片添加水印

    最近有个需要,需要批量给gif、jpg、png等多种图片添加水印。我查找了三种办法: 最开始我使用了批量水印大 […]...

  8. (四十二)c#Winform自定义控件-进度条扩展-HZHControls

    官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定 […]...