了解 Angular 7 中的路由器状态:通过 Angular RouterState 传递数据

yanding 2023-06-30 449

介绍

Angular 应用程序分为组件;这些组件有助于将业务逻辑划分为单独的文件,以便更好地理解。在使用这种基于组件的架构时,有时会发生一个组件依赖于另一个组件进行进一步处理的情况,因此它将数据从一个组件传递到另一个组件。

我们可以通过多种方式将数据从一个组件传递到另一个组件。Angular 7.2.0 引入了一种在路由组件之间导航时使用状态对象传递数据的新方法。使用状态对象的好处是,您可以使用 routeParams 在路由组件之间共享数据,而无需将其显示在 URL 段上,这与 Angular 中的 queryParams 不同。

教程目标:通过 Angular RouterState 传递数据

在开发演示应用程序之前,让我们看看演示应用程序是关于什么的。我们将构建一个具有三个网页的博客应用程序——主页、类别和类别博客。根据我们的博客标题——通过 Angular RouterState 传递数据,我们将看到如何将数据从 Categories 组件传递到 Blog by Categories 组件。

查看下面的视频,了解演示应用程序的用户界面。在视频中,检查控制台是否有使用 routerState 传递的数据。

创建角度应用程序

要创建一个新的角度应用程序,请键入以下命令:-


ng 新的我的博客应用程序

注意– 您可以随意命名它,而不是 my-blog-app。我们将在这里创建一个示例博客应用程序。

回答一系列问题以成功创建您的项目。确保选择 YES – Would you like to add Angular routing ? 这将创建一个文件app-routing.module.ts,我们将在其中添加我们的项目路由。

配置角度项目

角度项目结构


Angular 生成组件

使用以下命令为博客应用程序生成 Home、Categories 和 BlogsByCategory 组件。


ng gc 主页ng GC 类别ng gc 博客分类

运行命令后,项目结构将类似于


现在我们将创建一个名为MainService的模拟服务,以使用以下命令为我们的博客应用程序获取数据


ng g 服务服务/主要

现在创建两个文件:blog-list.jsoncategories.json用于模拟数据,并从我们的主要服务中获取这些数据。

// 类别.json


[
 {
   “编号”:1,
   “名称”:“应用程序开发”
 },
 {
   “编号”:2,
   "name":"区块链开发"
 },
 {
   “编号”:3,
   “名称”:“加密货币”
 },]

// 博客列表.json


[
 {
   "title": "如何为开源做出贡献?",
   "description":"Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sunt ducimus aliquam nulla nobis quo mollitia rem nisi dolore alias natus dignissimos dolores eum aliquid officiis error dolorem, minima repellat cumque!",
   “关键字”:“开源,软件,贡献”,
   "meta_desc":"lorem, ipsum dolor sit amet consectetur adipisicing elit. Sunt ducimus aliquam nulla nobis quo mollitia rem nisi dolore alias natus dignissimos dolores eum aliquid officiis error dolorem, minima repellat cumque!",
   “类别”:“开源”
 },
 {
   "title":"Angular 与 React 与 Vue.js",
   "description":"Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sunt ducimus aliquam nulla nobis quo mollitia rem nisi dolore alias natus dignissimos dolores eum aliquid officiis error dolorem, minima repellat cumque!",
   “关键词”:“角度,angular.js,反应,react.js,vue,vue.js”,
   "meta_desc":"lorem, ipsum dolor sit amet consectetur adipisicing elit. Sunt ducimus aliquam nulla nobis quo mollitia rem nisi dolore alias natus dignissimos dolores eum aliquid officiis error dolorem, minima repellat cumque!",
   “类别”:“网络开发”
 },
 {
   "title":"Objective C or Swift,iOS开发该选什么",
   "description":"Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sunt ducimus aliquam nulla nobis quo mollitia rem nisi dolore alias natus dignissimos dolores eum aliquid officiis error dolorem, minima repellat cumque!",
   "keywords":"iPhone, iOS, 软件, 移动开发",
   "meta_desc":"lorem, ipsum dolor sit amet consectetur adipisicing elit. Sunt ducimus aliquam nulla nobis quo mollitia rem nisi dolore alias natus dignissimos dolores eum aliquid officiis error dolorem, minima repellat cumque!",
   “类别”:“应用程序开发”
 },]

现在将以下代码粘贴到服务中


从'@angular/common/http'导入{HttpClient};从'@angular/core'导入{Injectable};从'rxjs'导入{Observable};
 @Injectable({
 providedIn:“根”})
 导出类 MainService {
 
 构造函数(私有 http: HttpClient){ }
 
 getAllCategories() {
   返回 this.http.get('assets/categories.json');
 }
 
 getBlogByCategory():可观察{
   返回 this.http.get('assets/blog-list.json');
 }}

我们将更新以下文件的代码:

  • 应用程序路由.module.ts

  • 主页.component.ts

  • 类别.component.ts

  • 类别.component.html

  • 博客分类.component.ts

  • blogs-by-category.component.html

你可能喜欢阅读

Angular 与 Reactjs:哪个更好?

配置路由

在这个文件中,我们将声明路由及其各自的组件。因此,应用程序将知道必须在哪条路由上呈现哪个组件。

// app-routing.module.ts


从'@angular/core'导入{NgModule};从 '@angular/router' 导入 { RouterModule, Routes };从'./blogs-by-category/blogs-by-category.component'导入{BlogsByCategoryComponent};从'./categories/categories.component'导入{CategoriesComponent};
 常量路线:路线= [
 {
   // 将重定向到类别页面的空路径。
   小路: '',
   重定向到:'家',
   路径匹配:'完整'
 },
 {
   // 显示博客的主页组件
   路径:'家',
   组件:HomeComponent
 },
 {
   // 显示博客类别列表
   路径:'类别',
   组件:CategoriesComponent
 },
 {
   // 显示所选类别的博客列表
   路径:“博客分类”,
   组件:BlogsByCategoryComponent
 }];
 @NgModule({
 导入:[RouterModule.forRoot(routes)],
 导出:[RouterModule]})导出类 AppRoutingModule { }

基本用户界面

在本节中,我们将为我们的基本用户界面添加以下代码。

// app.component.html

用以下代码替换您的 html 文件代码。


<标头类="标头">
 <h2 class="logo"><a routerLink="/">我的博客</a></h2>
 <ul class="主导航">
   <li><a routerLink="/">首页</a></li>
   <li><a routerLink="categories">类别</a></li>
   <li><a href="#">服务</a></li>
   <li><a href="#">关于我们</a></li>
 </ul></标题>
 <路由器插座></路由器插座>

// home.component.html


<div class="欢迎文本">
 <h3>欢迎来到我的博客,请为要显示的博客内容选择一个<em><a routerLink="/categories">类别</a></em>。</h3></div>

现在让我们进入教程的核心部分:通过 Angular RouterState 传递数据并开始在组件之间传输数据。

传递数据

更新表面用户界面后,打开与 Categories 组件相关的文件以更新 UI 并编写逻辑以将数据传递给 Blog by Categories 组件。

// 类别.component.html


<ul>
  <li *ngFor="let category of categories">
    <a routerLink="/blogs-by-category" [state]="category">{{category.name}}</a>
  </li></ul>

在这里,在属性指令 [state]=”object” 的帮助下,我们将数据传递给另一个组件。如果您在应用程序中依赖声明式导航,则使用此属性。

// 类别.component.ts


从'@angular/core'导入{Component,OnInit};从'../services/main.service'导入{MainService};
 界面分类{
 名称:字符串;}
 @成分({
 选择器:“应用类别”,
 templateUrl: './categories.component.html',
 styleUrls: ['./categories.component.css']})
 导出类 CategoriesComponent 实现 OnInit {
 公共类别:Categories[] = [];
 构造函数(私有mainService:MainService){}
 
 
 ngOnInit(): void {
   // 在组件加载时调用下面的方法来加载服务。
   this.getAllCategories();
 }
 
 getAllCategories() {
   // 我们正在订阅服务以获取可用类别列表。
   this.mainService.getAllCategories().subscribe((listCategories: any) => this.categories.push(...listCategories));
 }}

接收数据

现在是时候更新 Blog by Categories 组件的用户界面并编写从 Categories 组件接收数据的逻辑了。用以下代码替换您的.html 和 .ts文件。

// blog-by-categories.component.html

用以下代码替换您的 html 文件代码:-


<!-- 这里我们循环遍历每个博客对象以在 html 上显示 --><div *ngFor="让博客成为博客">
 <h3>{{blog.title}}</h3>
 <p>{{blog.description}}</p></div>

// blog-by-categories.component.ts


从'@angular/core'导入{Component,OnInit};从'../services/main.service'导入{MainService};
 界面博客{
 标题:字符串;
 描述:字符串;
 关键词:字符串;
 元描述:字符串;
 类别:字符串;}
 @成分({
 选择器:“应用博客按类别”,
 templateUrl: './blogs-by-category.component.html',
 styleUrls: ['./blogs-by-category.component.css']})导出类 BlogsByCategoryComponent 实现 OnInit {
 公共博客:Blog[] = [];
 构造函数(私有mainService:MainService){}
 
 ngOnInit(): void {
   const selectedCategory = history.state.name // 这里我们得到了我们选择的类别对象,我们使用对象键访问类别的名称。
   this.getBlogsByCategory(selectedCategory);
 }
 
 getBlogsByCategory(类别:字符串){
   this.mainService.getBlogByCategory()
     .subscribe((博客: 博客[]) => {
       this.blogs.push(...blogs.filter(blog => blog.category === category)); // 根据所选类别进行过滤。
     });
 }
 }

Github 仓库

您可以直接选择克隆 github 存储库并使用代码。运行以下命令来克隆 repo 或访问源代码


git 克隆 https://github.com/aamita96/my-blog-app.git

结论

我希望通过 Angular RouterState 传递数据的教程对你有用。如需更多此类教程,请访问Angular 教程页面并随时克隆 github 存储库。如果您正在寻找专门的开发人员来管理您的 Angular 项目或从头开始构建它,请联系我们聘请Angular 开发人员。我们向您保证,我们技术娴熟的开发人员将运用他们解决问题的能力来满足您的所有项目要求。

言鼎科技

The End