2017-10-04 100 views
1

我有一个服务A.该服务获得另一个服务B注入。 所以A使用B. B被A使用并注入As构造。Angular 2:服务注入服务,Provider

在组份I使用的服务答:我不直接使用服务B.但是,A使用B,因为B被注入A.

在这部分我需要把

providers: [A, B] 

如果我只把A放到提供商

"ERROR: No provider for B" 

在浏览器的Javascript控制台中。我没有收到编译器错误。

有没有办法隐藏组件提供程序中未直接使用的其他服务?

我不喜欢将B放入组件提供程序,而不是直接使用它。

谢谢!

编辑

我可以把所有的服务到模块提供者,然后我不能将它们设置在我使用服务的任何部件。但是这样做有没有负面影响?

+1

您可以在模块中提供服务B,以便您不必在每个组件中提供它。 – omeralper

+1

DI提供提供者。每个组件和模块都有自己的注射器,如果注射器无法找到提供者,它会询问其父注入器,直到模块出现为止。在服务A中使用服务B并不意味着服务B将被提供。组件或模块必须提供它。 – omeralper

回答

1

好像你完全不了解DI是如何工作的角...请仔细阅读https://angular.io/guide/hierarchical-dependency-injection#injector-bubbling

长话短说:

  • @NgModule({providers:[]}) export class AppModule{}在整个应用程序提供
  • @NgModule({providers:[]}) export class UserModule在所有可用@Component s和@Injectable s在当前模块中注册
  • @Component({providers:[]})可用于此组件(和ch ildren,但有一些例外)
  • @Component({providers:[]})创建新的注射器。在实践中,这意味着如果您的页面上有3个组件,则每个组件都有一个注入服务的NEW实例。即在这种情况下,您不会在组件之间共享任何内容。该功能很少需要...
  • Injector解决了DI树时,它搜索OWN注册@Injectables,如果没有发现任何东西,那么它会问父母。这意味着如果您的Service1取决于Service2,那么必须在@Component@NgModule中提供Service2,并且Angular仍然能够解析DI树。
  • 将所有@Injectable s放入@NgModule并没有什么缺点,而且这是“角度方式”。在大多数情况下有个人@Component({providers:[]})是过度的,理论上应该会减慢你的应用程序。所以只有当你真的需要每个组件的新服务实例时才使用它。