角度单例服务

时间:2018-10-30 18:28:57

标签: javascript angular dependency-injection

据我了解,使用providedIn: 'root'和将提供程序添加到模块的providers数组之间的唯一区别是摇树。当前,如果我添加providedIn: 'root',我的应用程序运行良好,但是如果我删除它并将其添加到模块的providers数组中,我将得到StaticInjectorError,说它找不到提供商。有没有人看到或了解为什么会发生这种情况?从文档中,我认为将其添加到providers数组应该可以使其工作

1 个答案:

答案 0 :(得分:1)

该错误是不言自明的。如果您进行providedIn: 'root',则您的服务将在RootInjector上注册。因此,基本上可以在整个App中使用它,而不必手动将其添加到要在其中使用此服务的每个模块的providers数组。

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

这里有一个Sample StackBlitz,可以帮助您更好地理解这一点。

仅描述一下:

  1. 我那里有3个模块:AppModuleNewModuleNotImportedModule
  2. 我将使用在NewModule的{​​{1}}的{​​{1}}和NotImportedModule中编写的服务。
  3. AppModule的{​​{1}}被添加到AppComponent的{​​{1}}数组中,而NewModule被添加到以下项的SampleService数组中: provides。这就是为什么我可以在NewModule中使用NewModule的原因。
  4. imports未添加到AppModule的{​​{1}}数组中,但是SampleServiceAppComponent。因此,我可以在NotImportedModule中使用它。

这意味着imports将在整个应用程序中使用,因为它已在RootInjector上注册,因为我们在其上使用了AppModule

但是由于AnotherService不是providedIn: 'root'而是被添加到AppModule的{​​{1}}数组中才能在AnotherService中使用,所以我们必须添加providedIn: 'root'的{​​{1}}到SampleService数组中。

希望这个例子更有意义。

相关问题