Angular 2:服务注入服务,提供者

时间:2017-10-04 20:40:15

标签: angular typescript

我有服务A.该服务获得另一个服务B注入。 因此A使用B. B由A使用并注入As construcotr。

在组件中我使用服务A.我不直接使用服务B.但A使用B,因为B被注入A中。

在这个组件中,我需要把

providers: [A, B]

如果我只将A放入供应商,我会

"ERROR: No provider for B" 

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

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

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

谢谢!

修改

我可以将所有服务放入模块提供程序中,然后我不能在使用服务的任何组件中设置它们。但这样做有什么负面影响吗?

1 个答案:

答案 0 :(得分:1)

好像你还没有完全理解DI在Angular中是如何工作的......请阅读https://angular.io/guide/hierarchical-dependency-injection#injector-bubbling

长话短说:

  • @NgModule({providers:[]}) export class AppModule{}可在整个申请中使用
  • @NgModule({providers:[]}) export class UserModule可在当前模块中注册的所有@Component@Injectable中使用
  • @Component({providers:[]})在此组件中可用(和子项,但也有一些例外)
  • @Component({providers:[]})创建新的注入器。在实践中,这意味着如果您的页面上有3个组件,则每个组件都具有注入服务的新实例。即在这种情况下,您不会在组件之间共享任何内容。很少需要这个功能......
  • Injector解析DI树时,它会搜索已注册的@Injectables OWN,如果找不到任何内容,则会询问父级。这意味着如果您Service1取决于Service2,那么必须在Service2@Component中提供@NgModule,而Angular仍然可以解决DI树。
  • 将所有@Injectable放入@NgModule并没有任何缺点,而且是#34; Angular way"。在大多数情况下拥有个人@Component({providers:[]})是矫枉过正的,理论上应该会减慢您的应用。因此,只有在每个组件确实需要新的Service实例时才使用它。