如何从Angular中的另一个服务调用服务的特定实例?
Posted
技术标签:
【中文标题】如何从Angular中的另一个服务调用服务的特定实例?【英文标题】:How to call a specific instance of a service from another service in Angular? 【发布时间】:2020-08-11 13:49:59 【问题描述】:所以我有一个“动作”组件,它在使用一些用户输入单击按钮后执行 MotionService。然后这个服务需要根据输入将数据传递给具体的 CaucusService 实例(我们称之为服务 A)或 DiscussComponent 的 CaucusService 实例 B。 但是,到目前为止,我似乎在 MotionService 中有一个新的 CaucusService 实例。 bateComponent 和 DiscussComponent 需要不同的 CaucusService 实例,所以我在每个 @Component 中都提供了它
基本上,我的 MotionService 需要在给定特定用户输入的情况下将数据传递给 A 或 B 我应该如何解决这个问题?
【问题讨论】:
你能提供一个stackblitz来说明你的问题吗? 【参考方案1】:您可以通过 2 种方式指定服务的确切实例:
简单 - 使其成为单例服务
只需将providedIn: 'root'
语句添加到服务的声明中即可确保该服务只有一个实例,这意味着您使用它的任何地方都是同一个实例。
@Injectable(
providedIn: 'root'
)
export class CaucusService
Hard - 使用注入令牌
这有点复杂,但允许多个实例存在并在需要时被引用。 Angular 文档中提供了有关如何执行此操作的信息。
https://angular.io/guide/dependency-injection-in-action https://angular.io/guide/dependency-injection-providers#non-class-dependencies https://angular.io/guide/dependency-injection#dependency-injection-tokens一般建议
处理无状态服务比处理包含某种状态的服务要容易得多。因此,请尝试从组件中传递状态,这样您也可以更轻松地测试服务。
【讨论】:
【参考方案2】: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);
这样试试
【讨论】:
但是如果你使用一个“new”操作符,你就不会得到依赖注入的好处 可以,但是如果FirstService中的字段或方法没有变化,那么最简单的解决方案就是这个。 或者,如文档中所述,您可以删除 "providedIn: 'root'" 并将服务导入 app.module 并添加到 providers 数组中。【参考方案3】:方法应该是这样的 为要在组件之间共享的数据创建模块级别的服务实例。
为组件级别使用创建单独的服务,其中仅包含组件日期
即模块级别的 A 和 B 服务,用于在服务之间共享 包含组件特定数据的 A1 和 B1 组件级服务。
【讨论】:
以上是关于如何从Angular中的另一个服务调用服务的特定实例?的主要内容,如果未能解决你的问题,请参考以下文章
如何从Angular中的另一个组件调用组件的ngOnit函数
如何从 wso2 ESB 中的另一个服务调用服务(或一个服务的参数)
如何从同一项目中的另一个 Kubernetes 集群调用 Kubernetes 集群公开的服务