我已经创建了一项服务,并在项目的“ root”中提供了该服务(使用标准快捷方式)。但是,它似乎正在创建多个实例,而不是使用同一实例。我通过在构造函数中将实例变量ID设置为随机值,然后在方法调用时将其打印到控制台来进行诊断。
@Injectable({
providedIn: 'root'
})
console.log(`Hodor ${this.ID}`);
这是一个问题,因为附加实例似乎无法访问我指定用于输出的组件。当我通过组件触发事件时,服务会处理它们并将输出放置在该组件中。但是,当我通过另一个组件触发它们时,它们将转到第二个实例,并且不会产生输出。
我的应用程序具有多个功能模块,这些功能模块先导入到核心模块,然后再导入到应用程序模块(app-> core-> feature)。我尝试在单独的模块中提供服务,然后将其导入应用程序,但这没有任何区别。有什么办法可以防止第二个实例出现? 'root'不应该照顾这个吗?
在这一点上,我正在考虑使用经典的OOP策略,即为服务设置静态变量,然后让构造函数进行设置或返回(如果已定义)。但是,该模式绝对不是标准的Angular。
答案 0 :(得分:1)
好的,我有答案,这是一个很好的答案。 VSCode有一个错误,导致它间歇性地将.js扩展名添加到Typescript类导入中。这通常不会影响代码的功能,因为.js类的确在运行时由TS转译器创建(即使我们都希望它指向原始的.ts文件)。但是,这会导致Angular将.js文件识别为另一个文件,并且如果该文件包含服务,则会导致它创建一个新的服务实例,如此处所发生的那样。将来我一定会在寻找这个东西。
答案 1 :(得分:0)
这很可能是由于另一个模块声明了自己的服务提供者而引起的-通过在其providers
中列出它或导入一个提供服务的模块来实现。
您可以通过在服务构造函数中设置一个断点,并检查调用方的变量以找出哪个注入器创建第二个实例(以及相关的令牌)来调试此问题。这应该将您带到声明附加提供程序的模块。