什么会导致Angular2服务创建多个实例?

问题描述 投票:1回答:2

我创建了一个服务,并在我的项目中以“root”形式提供它(使用标准快捷方式)。但是,它似乎是创建多个实例而不是使用相同的实例。我通过在构造函数中设置一个等于随机值的实例变量ID,然后在方法调用上将其打印到控制台来诊断这一点。

@Injectable({
    providedIn: 'root'
  })

console.log(`Hodor ${this.ID}`);

这是一个问题,因为附加实例似乎无法访问我指定用于输出的组件。当我通过组件触发事件时,服务处理它们并将输出放在该组件中。但是,当我通过另一个组件触发它们时,它们会转到第二个实例并且不会产生输出。

我的应用程序有多个功能模块,它们导入到核心模块,然后导入到应用程序模块(app - > core - > feature)。我尝试在单独的模块中提供服务并将其导入应用程序,但这没有任何区别。有没有办法阻止第二个实例出现?不应该'root'来照顾这个吗?

在这一点上,我正在考虑使用经典的OOP策略为服务设置静态变量,然后让构造函数设置或者如果已经定义则返回它。然而,该模式绝对不是标准的Angular。

angular
2个回答
1
投票

好的,我有答案,这是一个很好的答案。 VSCode有一个错误,导致它间歇性地将.js扩展名添加到Typescript类导入中。这通常不会影响代码的功能,因为.js类确实是由TS转换器在运行时创建的(尽管我们都希望它指向原始的.ts文件)。但是,这会导致Angular将.js文件识别为不同的文件,如果该文件包含服务,则会导致它创建新的服务实例,如此处所示。这是我将来肯定会留意的事情。


0
投票

这很可能是由一个不同的模块声明自己的服务提供者 - 通过将其列在providers中,或者通过导入一个模块来实现的。

您可以通过在服务构造函数中设置断点来调试它,并检查调用者的变量以找出哪个注入器创建了第二个实例(以及哪个令牌是相关的)。这应该会引导您进入声明其他提供程序的模块。

© www.soinside.com 2019 - 2024. All rights reserved.