Angular Service 单例问题探究

引言Angular Service是一种实现代码抽象的方式。它可以帮助我们将业务逻辑从页面的呈现逻辑中分离出来,以保持Component功能的纯净,以及某些常见功能的重用。一些开发者认为Component应该只处理页面呈现以及用户交互方面的逻辑,其他的都应该抽象到service中,即所谓的Lean Angular Component思想。我们在使用Angular Service时会有这种场景...
摘要由CSDN通过智能技术生成

墙竹

引言

Angular Service是一种实现代码抽象的方式。它可以帮助我们将业务逻辑从页面的呈现逻辑中分离出来,以保持Component功能的纯净,以及某些常见功能的重用。一些开发者认为Component应该只处理页面呈现以及用户交互方面的逻辑,其他的都应该抽象到service中,即所谓的Lean Angular Component思想。

我们在使用Angular Service时会有这种场景:有一个变量的状态是全局有效的,在不同的Component中都可能修改这个状态值,并且每个Component中都可以拿到这个Service中该状态变量的最新值。为了实现这个场景,一个最关键的点就是,Service必须是单例的。因为一旦有多个实例,那么每个Component看到的状态变量的值就不一致了。这篇文章就来试图探讨一下,什么情况下Angular Service会产生多个实例,以及如何解决这个问题。

Angular的官方文档关于单例Service的话题有不错的讨论。除了这篇文章,本文还参考了其他讨论类似话题的文章,再结合了自己的理解。欢迎批评和讨论。

什么时候会有多个实例?

总的来说在两种情况下,Angular会生成多实例的Service:

  • 声明Service的共享Module被多个其他Module导入

  • 声明Service的共享Module被其他lazy-load的Module导入

这两种情况看起来比较类似,但其实背后的原理有些不同,我们分别来看。

第一种情况是很常见的做法:我们定义了一个Service,比如是关于获取用户数据的,自然就会把它归到跟用户逻辑相关的Feature Module中,比如Customer Module:

@NgModule({
   
    providers: [CustomerService],
    declarations: [CustomerComponent],
    entryComponents: [CustomerComponent]
})
export class CustomerModule {
   }

这个<

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Angular 中,服务(Service)是用于封装可重用功能和数据的类。它被设计为在组件之间共享数据和逻辑的中间层。以下是在 Angular 中使用服务的一般步骤: 1. 创建服务: - 使用 Angular CLI 命令行工具生成一个新的服务:`ng generate service my-service`。 - 或者手动创建一个新的 TypeScript 类,并添加 `@Injectable()` 装饰器。 2. 在组件中使用服务: - 在组件类中导入服务类:`import { MyService } from './my-service.service';`。 - 在组件的构造函数中注入服务:`constructor(private myService: MyService) { }`。 - 然后就可以在组件中使用 `myService` 实来调用服务提供的方法或访问数据。 下面是一个简的示: ```typescript import { Injectable } from '@angular/core'; @Injectable({ providedIn: 'root' // 在根级别提供该服务 }) export class MyService { private data: string = 'Hello from service!'; getData(): string { return this.data; } setData(newData: string): void { this.data = newData; } } ``` ```typescript import { Component } from '@angular/core'; import { MyService } from './my-service.service'; @Component({ selector: 'app-my-component', template: ` <p>{{ message }}</p> <button (click)="updateMessage()">Update Message</button> ` }) export class MyComponent { message: string; constructor(private myService: MyService) { this.message = myService.getData(); } updateMessage(): void { this.myService.setData('New message from component!'); this.message = this.myService.getData(); } } ``` 在上面的示中,我们创建了一个名为 `MyService` 的服务类,其中包含了一个私有数据 `data` 和两个公共方法 `getData()` 和 `setData()`。然后在组件类 `MyComponent` 中注入了 `MyService` 服务,并通过调用服务的方法来获取和更新数据。 请注意,为了使服务可以在整个应用程序中共享,我们使用了 `providedIn: 'root'` 将服务提供在根级别。这样,Angular 就会在需要时自动创建和管理服务的一实。 希望这个简子能帮助你理解 Angular 中如何使用服务。在实际开发中,服务常常用于共享数据、处理业务逻辑、与后端 API 进行通信等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值