据我了解,使用providedIn: 'root'
和将提供程序添加到模块的providers
数组之间的唯一区别是摇树。当前,如果我添加providedIn: 'root'
,我的应用程序运行良好,但是如果我删除它并将其添加到模块的providers数组中,我将得到StaticInjectorError
,说它找不到提供商。有没有人看到或了解为什么会发生这种情况?从文档中,我认为将其添加到providers数组应该可以使其工作
答案 0 :(得分:1)
该错误是不言自明的。如果您进行providedIn: 'root'
,则您的服务将在RootInjector上注册。因此,基本上可以在整个App中使用它,而不必手动将其添加到要在其中使用此服务的每个模块的providers
数组。
但是现在您已经从providedIn: 'root'
装饰器中删除了@Injectable
,它仅在将其添加到这些模块的providers
数组的模块中可用。否则,将对导入将服务添加到providers
数组的模块的模块可用。
这里有一个Sample StackBlitz,可以帮助您更好地理解这一点。
仅描述一下:
AppModule
,NewModule
和NotImportedModule
。NewModule
的{{1}}的{{1}}和NotImportedModule
中编写的服务。AppModule
的{{1}}被添加到AppComponent
的{{1}}数组中,而NewModule
被添加到以下项的SampleService
数组中: provides
。这就是为什么我可以在NewModule
中使用NewModule
的原因。imports
未添加到AppModule
的{{1}}数组中,但是SampleService
是AppComponent
。因此,我可以在NotImportedModule
中使用它。这意味着imports
将在整个应用程序中使用,因为它已在RootInjector上注册,因为我们在其上使用了AppModule
。
但是由于AnotherService
不是providedIn: 'root'
而是被添加到AppModule
的{{1}}数组中才能在AnotherService
中使用,所以我们必须添加providedIn: 'root'
的{{1}}到SampleService
数组中。
希望这个例子更有意义。