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

什么会导致Angular2服务创建多个实例?,angular,Angular,我已经创建了一个服务,并在我的项目中的“root”中提供了它(使用标准快捷方式)。但是,它似乎正在创建多个实例,而不是使用同一个实例。我通过将实例变量ID设置为构造函数中的随机值,然后在方法调用时将其打印到控制台来诊断这一点 @Injectable({ providedIn: 'root' }) console.log(`Hodor ${this.ID}`); 这是一个问题,因为附加实例似乎无法访问我指定用于输出的组件。当我通过组件触发事件时,服务会处理它们并将输出放在该组件中。

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

@Injectable({
    providedIn: 'root'
  })

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

我的应用程序有多个功能模块,这些模块先导入到核心模块,然后再导入到应用程序模块(应用-->核心-->功能)。我曾尝试在一个单独的模块中提供该服务,并将其导入应用程序,但这并没有任何区别。有没有办法阻止第二个实例出现?“根”不应该处理这个吗


此时,我正在考虑使用经典的OOP策略,为服务设置一个静态变量,然后让构造函数设置该变量,或者在已经定义的情况下返回该变量。但是,这种模式肯定不是标准的角度模式。

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


您可以通过在服务构造函数中设置断点并检查调用者的变量来调试它,以找出哪个注入器创建了第二个实例(如果相关的话,还可以针对哪个令牌)。这将引导您进入声明附加提供者的模块。

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

您是否在
提供者
数组中的某个位置添加了此服务,这可以解释几个实例。我对提供者的所有.ts文件进行了grep搜索,但没有找到任何引用,所以看起来我完全掌握了providedIn:语法。经过一些额外的测试后,我觉得应该归咎于我的功能模块导入策略。我正在尝试让FM-A模块向另一个FM-B中的组件推送更新。我尝试将FM-B导入FM-A,也尝试将FM-A和FM-B导入app.module,但它似乎没有改变任何东西。似乎第二个功能模块正在创建自己的实例。我尝试重命名服务(文件名和类名),并通过每次调用来更新它。这并没有解决它。我将尝试一个断点。对我来说,类似的问题。我的服务的
import
语句有时带有.js扩展名,有时没有扩展名。具有使Angle看到两个不同文件的相同效果。此外,我们正在使用ngUpgrade,这可能与此有关。