如何从 Angular 中的另一个服务调用一个服务的特定实例?

Flo*_*rca 6 service dependency-injection angular-services angular-components angular

因此,我有一个组件“motions”,它在通过一些用户输入单击按钮后执行MotionService 。然后,该服务需要根据输入将数据传递给 DebateComponent 的特定 CaucusService实例(我们将其称为服务 A)或 DiscussComponent 的 CaucusService 实例 B。
但是,到目前为止,我似乎在 MotionService 中有一个 CaucusService 的新实例。DebateComponent 和 DiscussComponent 需要 CaucusService 的不同实例,因此我在每个 @Component 中提供了它

基本上,我的 MotionService 需要在给定特定用户输入的情况下将数据传递给 A 或 B 我应该如何解决这个问题?

Ben*_*ing 6

您可以通过两种方式指定服务的确切实例:

简单 - 使其成为单例服务

只需将该providedIn: 'root'语句添加到服务的声明中即可确保该服务只有 1 个实例,这意味着您在任何地方使用它都将是同一个实例。

@Injectable({
    providedIn: 'root'
})
export class CaucusService {}
Run Code Online (Sandbox Code Playgroud)

硬 - 使用注入令牌

这有点复杂,但允许存在多个实例并在需要时引用。角度文档中有有关如何执行此操作的信息。

一般建议

处理无状态服务比处理包含某种状态的服务容易得多。因此,尝试从组件传递状态,这也将使您可以更轻松地测试服务。


小智 3

import { Injectable, Injector } from '@angular/core';
import { FirstService } from './first.service';

@Injectable({
    providedIn: 'root'
})

export class SecondService {

    static firstService = new FirstService();

    getFieldFromFirst() {
        const field = SortingService.fileService.getField();
        console.log(field);
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试用这种方式

  • 但是如果您使用“新”运算符,您将无法获得依赖注入的好处 (2认同)