前端学习系列(10):Angular进阶——深入服务与路由

Angular 框架入门教程:从安装到路由、服务与状态管理详解 本文是 Angular 框架入门教程,介绍了安装方法、项目结构、组件、模块、路由配置、服务、表单处理及状态管理,为初学者提供全面指引。 阅读详情

前端学习系列(10):Angular进阶——深入服务与路由

一、回顾与引入

上一期我们深入研究了React的进阶知识,包括复杂的组件通信和Redux状态管理。本期我们将再次回到Angular框架,进一步探索Angular中服务与路由的高级特性。这些知识对于构建功能强大、可维护的Angular应用至关重要。

二、Angular服务的高级特性

2.1 依赖注入的深入理解

在Angular中,依赖注入(Dependency Injection,简称DI)是一项核心特性。它允许将一个对象的依赖关系传递给该对象,而不是在对象内部创建依赖。这使得代码更具可测试性、可维护性和可扩展性。

假设我们有一个UserService,用于处理用户相关的逻辑,并且该服务依赖于HttpClient来进行HTTP请求:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable({
  providedIn: 'root'
})
export class UserService {
  constructor(private http: HttpClient) {}

  getUsers() {
    return this.http.get('/api/users');
  }
}

在上述代码中,UserService通过构造函数接收HttpClient的实例,Angular会自动创建并注入这个实例。providedIn: 'root'表示该服务在应用的根模块中提供,整个应用都可以使用。

2.2 服务的共享与复用

服务可以在多个组件之间共享,实现逻辑的复用。例如,我们创建一个SharedService,用于存储和管理一些共享数据:

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class SharedService {
  private sharedData: string = '初始共享数据';

  getSharedData() {
    return this.sharedData;
  }

  setSharedData(data: string) {
    this.sharedData = data;
  }
}

然后在不同的组件中使用这个服务:

import { Component } from '@angular/core';
import { SharedService } from './shared.service';

@Component({
  selector: 'app - component - a',
  templateUrl: './component - a.component.html',
  styleUrls: ['./component - a.component.css']
})
export class ComponentAComponent {
  constructor(private sharedService: SharedService) {}

  updateSharedData() {
    this.sharedService.setSharedData('新的共享数据');
  }
}
import { Component } from '@angular/core';
import { SharedService } from './shared.service';

@Component({
  selector: 'app - component - b',
  templateUrl: './component - b.component.html',
  styleUrls: ['./component - b.component.css']
})
export class ComponentBComponent {
  sharedData: string;

  constructor(private sharedService: SharedService) {
    this.sharedData = this.sharedService.getSharedData();
  }
}

这样,ComponentAComponent和ComponentBComponent可以通过SharedService共享和管理数据,避免了在多个组件中重复编写相同的逻辑。

三、Angular路由的高级配置

3.1 路由守卫的使用

路由守卫用于在导航发生时进行权限验证、数据预取等操作。常见的路由守卫有CanActivate、CanDeactivate、Resolve等。

以CanActivate为例,假设我们有一个需要用户登录才能访问的页面,我们可以创建一个路由守卫来验证用户的登录状态:

import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router';
import { AuthService } from './auth.service';

@Injectable({
  providedIn: 'root'
})
export class AuthGuard implements CanActivate {
  constructor(private authService: AuthService, private router: Router) {}

  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): boolean {
    if (this.authService.isLoggedIn()) {
      return true;
    } else {
      this.router.navigate(['/login']);
      return false;
    }
  }
}

在路由配置中使用这个守卫:

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { DashboardComponent } from './dashboard.component';
import { AuthGuard } from './auth.guard';

const routes: Routes = [
  {
    path: 'dashboard',
    component: DashboardComponent,
    canActivate: [AuthGuard]
  }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule {}

这样,当用户尝试访问/dashboard时,AuthGuard会检查用户的登录状态,如果未登录则会导航到/login页面。

3.2 嵌套路由的实现

嵌套路由允许在一个组件的模板中定义子路由。例如,我们有一个ProductComponent,它包含产品列表和产品详情两个子页面,我们可以通过嵌套路由来实现:

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { ProductComponent } from './product.component';
import { ProductListComponent } from './product - list.component';
import { ProductDetailComponent } from './product - detail.component';

const productRoutes: Routes = [
  {
    path: 'products',
    component: ProductComponent,
    children: [
      {
        path: '',
        component: ProductListComponent
      },
      {
        path: ':id',
        component: ProductDetailComponent
      }
    ]
  }
];

@NgModule({
  imports: [RouterModule.forChild(productRoutes)],
  exports: [RouterModule]
})
export class ProductRoutingModule {}

在ProductComponent的模板中,我们需要添加<router - outlet>来显示子路由的内容:

<div>
  <h2>产品模块</h2>
  <router - outlet></router - outlet>
</div>

这样,当访问/products时会显示产品列表,访问/products/1时会显示ID为1的产品详情。

四、利用Angular服务和路由构建功能完备、安全可靠的单页应用程序

4.1 综合应用服务和路由实现业务逻辑

结合服务和路由,我们可以构建一个功能完备的单页应用程序。例如,在一个电商应用中,我们可以使用服务来管理用户的购物车数据、处理订单逻辑,使用路由来实现页面的导航,包括商品列表页、商品详情页、购物车页、结算页等。

在商品详情页,通过服务获取商品的详细信息,并提供添加到购物车的功能:

import { Component, OnInit } from '@angular/core';
import { ProductService } from './product.service';
import { CartService } from './cart.service';
import { ActivatedRoute } from '@angular/router';

@Component({
  selector: 'app - product - detail',
  templateUrl: './product - detail.component.html',
  styleUrls: ['./product - detail.component.css']
})
export class ProductDetailComponent implements OnInit {
  product: any;

  constructor(
    private productService: ProductService,
    private cartService: CartService,
    private route: ActivatedRoute
  ) {}

  ngOnInit() {
    const productId = this.route.snapshot.params['id'];
    this.product = this.productService.getProductById(productId);
  }

  addToCart() {
    this.cartService.addProductToCart(this.product);
  }
}

在购物车页,通过服务获取购物车数据并进行展示和结算操作:

import { Component, OnInit } from '@angular/core';
import { CartService } from './cart.service';

@Component({
  selector: 'app - cart',
  templateUrl: './cart.component.html',
  styleUrls: ['./cart.component.css']
})
export class CartComponent implements OnInit {
  cartItems: any[];

  constructor(private cartService: CartService) {}

  ngOnInit() {
    this.cartItems = this.cartService.getCartItems();
  }

  checkout() {
    // 处理结算逻辑
  }
}

通过路由配置,实现不同页面之间的导航:

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { ProductListComponent } from './product - list.component';
import { ProductDetailComponent } from './product - detail.component';
import { CartComponent } from './cart.component';

const routes: Routes = [
  {
    path: 'products',
    component: ProductListComponent
  },
  {
    path: 'products/:id',
    component: ProductDetailComponent
  },
  {
    path: 'cart',
    component: CartComponent
  }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule {}

4.2 确保应用程序的安全性和可靠性

通过路由守卫和服务中的数据验证机制,可以确保应用程序的安全性和可靠性。例如,在进行订单结算时,服务中可以验证用户的登录状态、购物车数据的完整性等;在路由守卫中,可以防止未授权用户访问敏感页面。同时,合理使用依赖注入可以提高代码的可测试性,通过单元测试和集成测试确保服务和组件的功能正确性,从而提升整个应用程序的稳定性。

五、总结与下期预告

本期我们深入学习了Angular服务和路由的高级特性,并通过实际案例展示了如何利用它们构建功能完备、安全可靠的单页应用程序。

下期预告
《前端性能优化实战》你将学到:

  • 前端性能指标及评估工具的使用
  • 从代码层面、资源加载、页面渲染等方面进行性能优化的具体方法
  • 构建高性能前端应用的最佳实践和常见误区

📢 系列提示:本系列持续更新中,建议点👍/收藏本篇文章,关注作者及时获取更新提醒。有任何问题欢迎评论区留言交流!

【Angular】——路由之刷新报404 项目进入测试期,发现了一个开发过程中没有发现的问题:发布后访问网站,使用过程一切正常:     但只要刷新,就会:       开始查了一些资料:大都是关于这样的说法:     那如果必须要这样解决的话,不就违背了前后端分离的原则?又开始让后端控制前端,这样前端自己封装路由又有何深刻的意义。因为有着这样的信念:肯定有前端的解决方案,所以继续查资料,最终发现了我想要的, 阅读详情

相关推荐

Angular路由进化与实践:从哈希路由到HTML5模式

本文详细探讨了Angular中路由的进化,从传统的基于哈希的路由到现代的HTML5客户端路由技术。介绍了HTML5模式路由的优势与配置,以及如何在Angular项目中应用。同时,也提出了在使用HTML5模式路由时可能遇到的浏览器兼容性和服务器支持问题,并给出了相应的解决方案。

weixin_32287387的博客 1103

前端 -- angular快速入门

Angular 是一个由 Google维护的开源JavaScript框架,用于在HTML和JavaScript中构建Web应用程序。Angular CLI 可以快速搭建框架,创建module,service,class,directive等;具有webpack的功能,代码分割,按需加载;代码打包压缩;模块测试;热部署,有改动立即重新编译,不用刷新浏览器;而且速度很快有开发环境,测试环境,生产环境的配置,不用自己操心;

weixin_44289670的博客 5919

掌握MEAN栈前端开发:Angular路由与组件实践

本文介绍了MEAN栈开发中的Angular部分,特别是前端路由管理和组件创建。通过具体代码示例,展示了如何使用routerLink、routerLinkActive等指令在Angular应用中实现导航,以及如何创建和配置路由模块。文章深入探讨了Angular中的路由机制,并通过实际操作演示了如何构建一个功能完备的主页和注册页面。

weixin_34535286的博客 326

前端架构三大巨头之一Angular | 深度讲解

云智慧集团成立于2009年,是国内领先的全栈智能业务运维解决方案服务商。经过多年自主研发,公司形成了从IT运维、电力运维到IoT运维的产业布局,覆盖ITOM、ITOA、ITSM、DevOps以及IoT几大领域,为金融、政府、运营商、能源、交通、制造等上百家行业的客户,提供了数字化运维体系建设及全生命周期运维管理解决方案。云智慧秉承Make Digital Online的使命,致力于通过先进的产品技术,为企业数字化转型和提升IT运营效率持续赋能。 作者简介 杨迎辉,云智慧/开发工程师,云智慧前端开...

Sharon0408的博客 8104

9 HAL库驱动框架简述(STM32HAL库)

HAL库外设的使用步骤总结如下:1、定义并填充xxx外设句柄结构体。2、如果遵循HAL库规范,通过HAL_xxx_MspInit()函数,实现外设底层资源的初始化,包括但不限于GPIO、时钟、DMA、中断等资源的初始化。3、调用HAL库的对应外设初始化函数,形如:HAL_xxx_Init()。4、初始化完成,开始使用外设。5、使用方法具体查看对应外设的HAL库驱动包中的说明:补充:HAL库使用主线外设初始化外设使用。

qq_25218501的博客 1981

新手别怕!用‘东北天’和‘右前上’坐标系,5分钟搞懂惯性导航姿态矩阵(含Python验证代码)

本文通过‘东北天(ENU)’和‘右前上(RFU)’坐标系,详细解析惯性导航中的姿态矩阵概念。包含Python代码验证,帮助新手快速理解坐标变换、欧拉角及旋转矩阵的构建与应用,特别强调有限转动不可交换性与无限转动次序无关的区别。

weixin_29062255的博客 332

前端三大主流框架:React、Vue、Angular

前端三大主流框架分别是Angular、React和Vue。AngularAngular原名AngularJS,诞生于2009年,由Google开发并维护。它是一个完整的框架,提供了数据绑定、组件化、路由、依赖注入等功能。Angular采用了TypeScript作为开发语言,它是JavaScript的一个超集,提供了静态类型检查和更强大的面向对象编程能力。Angular的特点包括功能强大、完整且稳定,适用于开发大型和复杂的Web应用。

日常笔记/总结/系列知识梳理 6401

告别以太网瓶颈:手把手教你为AI训练集群搭建InfiniBand网络(以NVIDIA DGX A100/H100为例)

本文详细指导如何为AI训练集群搭建InfiniBand网络,解决以太网瓶颈问题,特别针对NVIDIA DGX A100/H100系统。通过硬件选型、网络架构设计和性能调优,显著提升多机多卡训练效率,适用于大规模模型训练场景。

weixin_30336061的博客 310

Angular(三):进阶

路由

OneFine的技术博客 691

IMU卡尔曼滤波方法详细介绍

本文介绍了基于IMU和卡尔曼滤波的状态估计方法。系统采用9维状态向量(位置、速度、加速度计零偏),通过牛顿运动学建立状态方程,并利用外部位置观测进行校正。详细推导了状态转移矩阵和控制输入矩阵的形式,阐述了预测和更新的计算步骤。同时说明了过程噪声Q和观测噪声R的设置原则,其中Q反映模型不确定性,R取决于传感器精度。该方法可有效融合IMU测量与外部观测数据,实现位置、速度和偏置的联合估计。

haing2019的博客 757

N32串口DMA接收不定长数据:空闲中断与DMA通道的协同处理

本文详细解析了在N32系列MCU中,利用串口空闲中断与DMA通道协同处理不定长数据的核心机制与实战方法。通过剖析空闲中断的触发时机、DMA的配置要点以及两者协同工作的关键时序,提供了避免数据错乱的避坑指南和完整的代码实现,旨在帮助开发者构建高效、可靠的嵌入式串口通信子系统。

weixin_29191669的博客 123

Angular学习总结-入门篇

目录 一、Angular介绍 二、 学习Angular必备基础 三、 Angular环境搭建 四、 Angular创建项目 五、 Angular环境搭建以及创建项目的时候可能遇到的错误 六、Angular开发工具介绍 Angular项目结构介绍 创建组件/服务 angular语法 变量 ngFor循环+ngIf判断+ngSwitch 动态修改样式ngClass+ngStyle 双向数据绑定 管道(Pipe) 获取dom节点 ng...

小冷在努力~ 1万+

11、ThingsBoard集群部署k8s

今天终于有时间去搞这个啦,拖了很久了,一直没时间,因为我本地没有那么多机器资源,开虚拟机不够,如果租用阿里云服务器,需要有充值的时间,因为这个费用是按小时付费,需要有连贯的时间来搞才行,今天恰好有时间,就开始搞了,弄成功搞出来了,特地写博客记录下来。

AldrichEugene 990

前端框架Angular 详细学习要点

Angular 是一个由 Google 开发和维护的现代前端 JavaScript 框架,具有高效的数据绑定、模块化架构、依赖注入等特性,适合构建大型企业级单页应用。

2401_87352036的博客 1410

基于STM32L4XX 、HAL库的DRV8311三相无刷直流电机(BLDC)驱动应用C语言程序设计

是德州仪器(TI)推出的一款针对三相无刷直流(BLDC)电机或永磁同步电机(PMSM)的集成驱动器芯片。:集成了三个半桥MOSFET、门极驱动电路、电荷泵(支持100%占空比)、稳压器以及多种保护电路。:工作电压最高可达,持续输出电流可达,峰值电流可达。:通过引脚直接控制每个半桥的PWM和使能。这种方式需要MCU输出6路信号,控制更灵活。:通过SPI总线配置内部寄存器,仅需PWMA/B/C三路PWM信号即可控制电机。可以读取故障状态、配置参数(如死区时间、电流保护阈值等),是更常用和推荐的方式。

PP_Cottage的博客 553

华为OD机试双机位C卷-组装新的数组(Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【组装新的数组】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - 组装新的数组。

qq_45776114的博客 1145

Angular微服务架构终极指南:前端与后端微服务高效协同的10个核心策略

Angular作为Google开发的现代前端框架,凭借其高效的数据绑定、模块化架构和依赖注入特性,已成为构建大型企业级单页应用的首选。本文将深入探讨Angular与微服务架构的协同策略,帮助开发者快速掌握前后端高效协作的关键技术。 ## 1. 模块化设计:构建可独立部署的Angular微前端 Angular的模块化系统天然支持微服务架构的前端实现。通过合理划分功能模块,每个团队可以独立开发、测

gitblog_00720的博客 823

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Angular前端框架进阶教程

Angular是一个由谷歌维护的开源前端框架,它允许开发者使用TypeScript编写组件化的代码,从而构建高性能的Web应用程序。组件化架构:通过组件化的方式,开发者可以轻松地构建和维护大型应用。双向数据绑定:Angular的双向数据绑定机制让数据的同步变得更加简单。通过本文的介绍,我们可以看到Angular前端框架的强大功能和灵活性。掌握Angular的进阶特性和最佳实践,不仅能够提高开发效率,还能构建出性能优越、易于维护的应用程序。对于前端开发者来说,深入学习Angular是非常有价值的。

2501_92487853的博客 468

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

前端学习系列(7):前端框架基础之Angular入门

本期我们初步了解了Angular框架,学习了它的基本概念、安装配置、组件创建、模板语法以及数据绑定和事件处理。这些基础知识为我们进一步深入学习Angular奠定了基础。下期预告《Angular进阶:服务与路由》你将学到如何创建和使用Angular服务来共享数据和逻辑Angular路由的基本配置和使用,实现页面之间的导航构建一个具有多页面导航和数据共享功能的Angular应用程序📢系列提示有任何问题欢迎评论区留言交流!

Azperk的博客 1271

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【前端路由】多框架路由对比与选型大总结(Vue、React、Angular)

本文对比分析了Vue Router、React Router和Angular Router三大前端路由方案的核心特性与适用场景。Vue Router以声明式配置见长,适合中小型项目;React Router采用组件化设计,灵活性高,适用于大型应用;Angular Router提供模块化架构和强大守卫功能,适合企业级项目。文章从设计理念、功能特性、性能表现和开发体验等维度进行详细对比,并给出选型建议:中小项目推荐Vue Router,大型项目选择React Router,企业级应用采用Angular

silverclayz的技术分享 2583

Angular前端框架进阶

Angular前端框架进阶涉及多个方面,包括核心概念、模块与依赖注入、路由与导航、性能优化和最佳实践。通过深入了解这些主题,开发者可以更好地掌握Angular的高级特性,并构建高效、可维护的应用。为了实现这一目标,开发者需要不断学习和实践,关注最新的Angular发展趋势和最佳实践。此外,与其他开发者的交流和合作也是提高技术水平的重要途径。在未来,Angular将继续发展,为前端开发提供更多强大的功能。

2501_92487756的博客 566

【AngularJS】第10节 Angular 路由系统

Angular路由系统摘要 Angular路由系统是SPA的核心功能,支持静态路由(如首页)、动态路由(带参数)和嵌套路由。关键点包括: 路由配置:通过RouterModule定义路径映射,支持参数传递(如user/:id) 嵌套路由:使用children配置子路由,父模板需包含<router-outlet> 路由守卫: CanActivate控制访问权限 Resolve预加载数据 性能优化:支持模块懒加载(loadChildren) 典型应用场景包括权限控制、数据预加载和复杂页面结构组织。

silverclayz的技术分享 894

angular8 路由策略 LocationStrategy

angular8 路由策略 LocationStrategy一、什么是路由二、 前端路由2.1、hash实现2.2、HTML5实现2.3、Aangular8路由策略实现三、优点四、总结五、学习地址 一、什么是路由 假如我们有一台提供 Web 服务的服务器的网络地址是:127.0.0.1(localhost),而该 Web 服务又提供了三个可供用户访问的页面,其页面 URI 分别是: http://127.0.0.1/login/login http://127.0.0.1/plan/plan-home ht

lvxinaidou的博客 6703

Angular10+Zorro10整合

随着前后端分离的火爆,以及npm生态的成长,各种前端开发越来越火爆,加上之前就接触过angular、ionic、uniapp等等,做过移动端的H5开发,这次想着整理一把PC版本的前后端分离。 目前angular以及发布了10版本,随着版本的逐渐迭代,功能的完善,以级生态的丰富,可以说是,现在要什么有什么,只有你想不到,没有你找不到。angular相关的信息可以查看文档:https://angular.cn/docs,他也有一些推荐,包括官方的,华为的,gz-Zorro的,以及...

cause的博客 2864

angular 前端路由不生效解决方案

angular 前端路由不生效解决方案 Intro 最近使用 Angular 为我的活动室预约项目开发一个前后端分离的客户端,在部署上遇到了一个问题,前端路由不生效,这里记录一下。本地开发正常,但是部署到服务器上就有问题,之前部署到IIS上时需要配置一个 url rewrite ,可能遇到了类似的问题,查阅一番之后确实是这样。 启用前端路由服务器配置 没有一种配置可以适用于所有服务器。 后面这些部...

weixin_30856965的博客 897

前端路由的实现原理(包括Angular、vue等框架)

这里写自定义目录标题浏览器路由的介绍hash路由HTML5 History API 浏览器路由的介绍 通常来说路由即是URL到函数的映射,比如我们在客户端输入一个URL,该URL会被提交到一个控制器,相应的控制器会对客户端提交上来的路由进行解析, 从而找到处理这个 URL 的类和函数,然后执行。最初web系统的路由都是由服务端来实现的,后来随着前端技术的发展,web系统的路由慢慢都交由前端来实现。...

Benjamin920813的博客 2995
上一篇: 前端学习系列(9):React进阶——深入组件通信与状态管理
下一篇: 前端学习系列(11):前端性能优化实战
DoYangTan
博客等级 码龄5年 1946粉丝 319原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值