javascript - Angular 单例服务

标签 javascript angular dependency-injection

根据我的理解,使用 providedIn: 'root' 和将提供程序添加到模块的 providers 数组中的唯一区别是树摇动。目前,如果我添加 providedIn: 'root' ,我的应用程序工作正常,但如果我删除它并将其添加到模块的提供者数组中,我会得到 StaticInjectorError说找不到提供商。有谁见过这个或了解为什么会发生这种情况?从文档中我相信将其添加到提供者数组应该允许它工作

最佳答案

这个错误是不言自明的。如果您执行 providedIn: 'root',那么您的服务就会在 RootInjector 上注册。因此,它基本上可以在整个应用程序中使用,而无需手动将其添加到您想要使用此服务的每个模块的 providers 数组中。

但是现在您已经从 @Injectable 装饰器中删除了 providedIn: 'root' ,它将仅对您将其添加到的模块可用这些模块的 providers 数组。或者,它可供正在导入将服务添加到 providers 数组中的模块的模块使用。

这是一个Sample StackBlitz帮助您更好地理解这一点。

只是描述一下:

  1. 我有 3 个模块:AppModuleNewModuleNotImportedModule
  2. 我将使用 AppModuleAppComponent 中的 NewModuleNotImportedModule 编写的服务>.
  3. NewModuleSampleService 添加到 NewModuleNewModule 的 provides 数组中 添加到 AppModuleimports 数组中。这就是为什么我能够在 AppComponent 中使用 SampleService
  4. NotImportedModule 未添加到 AppModuleimports 数组中,但 AnotherServiceprovidedIn :'根'。因此我可以在 AppModule 中使用它。

这意味着 AnotherService 将可在整个应用程序中使用,因为它已在 RootInjector 上注册,因为我们在其上使用了 providedIn: 'root'

但是由于 SampleService 不是 providedIn: 'root' 而是添加到 NewModuleproviders 数组中> 要在 AppModule 中使用它,我们必须将 NewModule 添加到 AppModuleimports 数组中。

希望这个例子更有意义。

关于javascript - Angular 单例服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53070689/

相关文章:

c# - 如何访问用AddSingleton<T>注入(inject)的后台服务的成员

android - 编译项目时出现 Dagger 错误

javascript - 无法显示 Bootstrap 关闭按钮

javascript - 如何下载 chrome.devtools.network.getHAR 以 .har 形式返回的对象?

angular - md-grid-list rowHeigh ="fit"不工作。是否有替代解决方案

angular - 可观察到的 : Cancel previous http request on new subscription call

根据选择显示图像的 Javascript 函数不起作用

javascript - jQuery Ajax 重写失败方法

javascript - 使用 forRoot 依赖于模块的 Angular 传递服务

jsf - 了解CDI中类型安全的必要性