我有服务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放入组件提供程序而不是直接使用它。
谢谢!
修改
我可以将所有服务放入模块提供程序中,然后我不能在使用服务的任何组件中设置它们。但这样做有什么负面影响吗?
答案 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实例时才使用它。