第一个 Angular 项目 - 添加路由

第一个 Angular 项目 - 添加路由

前置项目是 第一个 Angular 项目 - 添加服务,之前的切换页面使用的是 ngIf 对渲染的组件进行判断,从而完成渲染。这一步的打算是添加路由,同时添加 edit recipe 的功能(同样通过路由实现)

用到的内容为:

  • [Angular 基础] - routing 路由(上)
  • [Angular 基础] - routing 路由(下)

配置基础路由

这里修改的文件有以下文件:

在这里插入图片描述

其中:

  • header
  • recipe-details
  • recipe-item

三个 HTML Template 修改的内容为删除 a 标签中的 href 属性,并添加 style="cursor: pointer" 维持原本的样式,这里不多赘述

其他修改如下:

  • app-routing

    const appRoutes: Routes = [{ path: '', redirectTo: '/recipes', pathMatch: 'full' },{ path: 'recipes', component: RecipesComponent },{ path: 'shopping-list', component: ShoppingListComponent },
    ];@NgModule({imports: [RouterModule.forRoot(appRoutes)],exports: [RouterModule],
    })
    export class AppRoutingModule {}
    

    这里主要的修改在 routing 两篇笔记中都提过,最低层次的配置需求需要包含路径和对应的组件,redirectTo 中使用 pathMatch 因为 Angular 的路由是通过前缀匹配的,如果不添加这个属性,那么从首页登陆就会 infinite loop,从而报错

  • app V 层

    删除原本的 ngIf 部分,替换为 <router-outlet></router-outlet>

  • app module

    imports 中新增 AppRoutingModule

实现后效果如下:

在这里插入图片描述

添加子路由

设置如下:

const appRoutes: Routes = [{path: 'recipes',component: RecipesComponent,children: [{ path: '', component: RecipeStartComponent },{ path: 'new', component: RecipeEditComponent },{ path: ':id', component: RecipeDetailComponent },{ path: ':id/edit', component: RecipeEditComponent },],},
];

实现后效果如下:

在这里插入图片描述

这里基本上没什么特别难的,唯一需要注意的就是 :idnew 的顺序。:id 也算是一个 wildcard,它会将所有的参数都默认为变量名为 id 的值,并且传到 Params 里去

修改获取 recipe

这里是 recipe details 的实现,修改如下:

export class RecipeDetailComponent implements OnInit {recipeId: string;activeRecipe: Recipe;constructor(private ingredientService: IngredientService,private recipeService: RecipeService,private activatedRouter: ActivatedRoute) {}ngOnInit(): void {this.activatedRouter.params.subscribe((params: Params) => {this.recipeId = params.id;this.activeRecipe = this.recipeService.getRecipeById(this.recipeId);});}
}

service 中的实现就是返回 array 中的数据就是了,这里实现不多赘述

其他需要做的地方就是 recipe-list 中传值的 onSelect,以及对应的数据传输(@Input & @Output)

动态拼接路由

当前项目还是一个 dummy 项目,所以没法做到直接从 recipe 中获取 id,所以这里要做的就是从 ngFor 中将 index 传到下一个组件,并且在下一个组件中获取 id:

  • recipe list 修改:

    <app-recipe-item*ngFor="let recipe of recipes; let i = index"[recipe]="recipe"[id]="i + 1"
    ></app-recipe-item>
    
  • recipe item 修改:

    <astyle="cursor: pointer"[routerLink]="[id]"routerLinkActive="active"class="list-group-item clearfix"
    ></a>
    

对应的 @Input 绑定就不实现了,这部分内容在 [Angular 基础] - 自定义事件 & 自定义属性 中;ngFor 的复习在 [Angular 基础] - 指令(directives)

此时的实现如下:

在这里插入图片描述

可以看到和之前的实现基本没有变化,除了 URL 路径的变动

edit recipe 实现

具体的功能会等到学完表单再实现,不过这里通过 ngOnInit 简单的判断一下当前页面是新建页面还是编辑页面:

@Component({selector: 'app-recipe-edit',templateUrl: './recipe-edit.component.html',styleUrl: './recipe-edit.component.css',
})
export class RecipeEditComponent implements OnInit {id: number;editMode = false;constructor(private route: ActivatedRoute) {}ngOnInit() {this.route.params.subscribe((params: Params) => {this.id = +params.id;this.editMode = isNaN(this.id);});}
}

这里的逻辑处理相对而言比较暴力,简单的说就是如果传进来的参数不是 new——有 new 走不进 :id——并且无法转成数字,那么就肯定不是编辑模式,这种情况下默认转为新建模式。

具体的逻辑处理可以写很细,这里只是大致实现一下

new 和 edit 的路由实现

这个部分比较简单,Angular 似乎对 routerLink 得绑定没什么限制,注意一下绝对路径/相对路径就能实现了:

在这里插入图片描述

⚠️:另一个实现方式是绑定 onclick handler,随后通过 this.router.navigate 进行实现。二者都可以,鉴于现在并没有什么复杂的逻辑需求,我就直接绑定 routerLink

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/722849.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决物理机装不上VMnet1和VMnet8的虚拟网卡问题

问题描述&#xff1a; 博主在使用虚拟机时&#xff0c;发现物理机的ping命令连接不上虚拟机&#xff0c;导致xshell软件也连接不上&#xff0c;最后发现问题是更改适配器设置中没有虚拟机的网卡&#xff08;VMnet1和VMnet8&#xff09;&#xff1a; 方法一&#xff1a; 博主搜…

【MySQL】深入解析日志系统:undo log、redo log、bin log

文章目录 前言1、undo log1.1、undo log 是什么1.2、事务回滚 2、redo log2.1、redo log 是什么2.2、redo log 刷盘2.3、redo log 硬盘文件 3、bin log3.1、bin log 是什么3.2、bin log 和 redo log 区别3.3、bin log 刷盘3.4、两阶段提交 前言 MySQL数据库提供了功能强大的日…

LeetCode 1976.到达目的地的方案数:单源最短路的Dijkstra算法

【LetMeFly】1976.到达目的地的方案数&#xff1a;单源最短路的Dijkstra算法 力扣题目链接&#xff1a;https://leetcode.cn/problems/number-of-ways-to-arrive-at-destination/ 你在一个城市里&#xff0c;城市由 n 个路口组成&#xff0c;路口编号为 0 到 n - 1 &#xff…

使用vite创建一个vue3项目

创建一个vue3项目 1.使用命令npm create vuelatest来创建一个vue3项目&#xff0c;注意&#xff1a;官网说明了必须node版本是18及以上的&#xff0c;这边需要注意下 2.然后根据提示进入项目目录 先npm install安装依赖&#xff0c;然后npm run dev启动项目 大家可以看到&am…

Windows安装Go语言及VScode配置

最近搞自己的网站时突然想起来很多上学时的事&#xff0c;那会美国总统还是奥巴马&#xff0c;网页课教的是DreamWeaver跟Photoshop&#xff0c;其他语言像PHP、Java8、Python都有学一点&#xff0c;讲究一个所见即所得。虽然是信管专业那时和斌桑班长对新语言很感兴趣&#xf…

分享一个完全免费的GPT4站点,gpts也可以用

给大家分享一个完全免费的GPT4站点&#xff0c;gpts也可以用点击链接可用

【Leetcode】1588.所有奇数长度子数组的和

题目描述 思路 题目要求我们求解所有奇数长度数组的和。若暴力循环求解&#xff0c;时间复杂度过高。所以&#xff0c;我们可以采用前缀和优化。 如上图输入arr数组&#xff0c;sum[i]用于计算arr数组中前i个数的和。(在程序中&#xff0c;先给sum[0]赋值&#xff0c;等于arr[0…

小程序API能力集成指南——画布API汇总(三)

CanvasContext canvas 组件的绘图上下文。 方法如下&#xff08;2&#xff09;&#xff1a; arc CanvasContext.arc CanvasContext.arc(number x, number y, number r, number sAngle, number eAngle, boolean counterclockwise) 功能描述 创建一条弧线。 创建一个圆可…

android开发者工具,最新整理

一 Java相关 1.重载函数的签名(区别是否是重载函数) 答&#xff1a;方法名参数类型参数顺序(返回值不是) 2.finalize的工作原理 答&#xff1a;一旦垃圾收集器准备好释放对象占用的存储空间&#xff0c;它首先调用finalize()&#xff0c;而且只有在下一次垃圾收集过程中&#…

AlibabaCloud微服务:Linux 部署 Sentinel 流量控制

目录 一、实验 1.环境 2.Linux 部署 Sentinel 3. 微服务接入Sentinel配置 二、 问题 1.Linux本地启动Sentinel控制台 2.JDBC连接失败 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统软件版本IP备注Linuxopenjdk 1.8.0192.168.204.200 maven3.5.0nac…

【踩坑专栏】追根溯源,从Linux磁盘爆满排查故障:mycat2与navicat不兼容导致日志暴增

昨天遇到了一个比较奇怪的问题&#xff0c;就是在挂起虚拟机的时候&#xff0c;虚拟机提示我XX脚本正在运行&#xff0c;很奇怪&#xff0c;我没有运行脚本&#xff0c;为什么会提示我这个呢。今天恢复虚拟机&#xff0c;也提示了一下脚本的问题&#xff0c;而且发现Linux明显异…

关于制作Python游戏全过程(汇总1)

目录 前言: 1.plane_sprites模块: 1.1导入模块: 1.1.1pygame&#xff1a;一个用于创建游戏的Python库。 1.1.2random&#xff1a;Python标准库中的一个模块&#xff0c;用于生成随机数。 1.2定义事件代号: 1.2.1ENEMY_EVENT&#xff1a;自定义的敌机出场事件代号&#xf…

目标检测5:采用yolov8, RK3568上推理实时视频流

上一个效果图&#xff0c;海康球机对着电脑屏幕拍&#xff0c;清晰度不好。 RK3568接取RTSP视频流&#xff0c;通过解码&#xff0c;推理&#xff0c;编码&#xff0c;最终并把结果推出RTSP视频流。 数据集采用coco的80个种类集&#xff0c;通过从yovo8.pt&#xff0c;转换成R…

flutter开发文档,靠着这份面试题跟答案

1、知道它是什么、有什么用 相信很多人在学习的时候&#xff0c;一开始都会在网上找一整套资料或者买一本书来学习&#xff0c;结果就是内容太多&#xff0c;学了记不住或者学到一半感觉很难&#xff0c;便放弃了&#xff0c;更别提写代码了&#xff0c;根本无从入手。 而更好…

Python+Vue全栈开发BI数据可视化项目

如何得到这样一个大屏可视化展示 数据清洗&#xff0c;运算&#xff0c;建模&#xff0c;分析&#xff0c;可视化

java核心技术第十一章学习笔记

swing常用用户界面组件 Swing和模型-视图-控制器设计模式 模型&#xff1a;存储内容&#xff0c;必须实现改变内容和查找内容的方法&#xff0c;不可见 视图&#xff1a;显示内容 控制器&#xff1a;处理用户输入 一个模型可以有多个视图&#xff0c;每个视图可以显示全部…

微信小程序开发系列(十九)·wxml语法·setData()修改数据

目录 步骤一&#xff1a;创建一个data对象 步骤二&#xff1a;双大括号写法的使用 步骤三&#xff1a;创建一个更新事件按钮 步骤四&#xff1a;定义事件处理函数获取数据 步骤五&#xff1a;定义事件处理函数修改数据 方法一&#xff1a;通过赋值的方式直接修改数据 方…

android音视频编解码,你有过迷茫吗

3-5年的Android工程师最容易遇到的4个瓶颈是什么&#xff1f; 1.原理认知浅 工作内容多是简单UI界面开发和第三方SDK整合&#xff0c;对原理层和底层开发了解不深 2.技术视野窄 长期在小型软件公司&#xff0c;外包公司工作&#xff0c;技术视野被限制的太厉害 3.薪资提升…

React富文本编辑器开发(五)

到目前为止我们所有的功能操作都是直接写在 onKeydown 事件里了&#xff0c;但如果我想复用相同的功能怎么办呢&#xff0c;最好的办法就是拨离了&#xff0c;下面我就形如进行这样的操作&#xff0c;把相关的可复用的命令操作抽取出来。 新建文件 _helper.jsx,创建一个协助器…

游戏引擎渲染流程

一、渲染概述 我们首先看到渲染技术的发展 游戏渲染面临的挑战&#xff1a; 一个容器中同一时刻有大量的游戏对象需要进行渲染&#xff0c;并且不同对象渲染的形式、算法还有所差异&#xff0c;这些使得游戏的绘制系统变得非常复杂&#xff1b;其次&#xff0c;游戏引擎的渲染…