Angular依赖注入:providers与imports的困惑及响应式表单疑问
关于Angular响应式表单DI的困惑解答
我完全懂你这种懵懵的感觉!当初我刚上手Angular响应式表单的时候也犯过同样的疑惑——明明没在组件或者模块的providers数组里注册任何表单相关的服务,怎么就能直接用FormBuilder、FormGroup这些东西,而且表单还能正常跑起来?
其实核心原因很简单:
响应式表单的依赖已经被官方模块自动注册了
当你在模块(比如AppModule或者某个特性模块)里导入ReactiveFormsModule的时候,这个模块内部已经把响应式表单所需的所有核心服务(比如FormBuilder、FormControl、FormGroup对应的提供者)都配置好了。也就是说,ReactiveFormsModule自己的providers数组里已经包含了这些依赖,一旦你导入这个模块,Angular的DI系统就会自动把这些服务加入到当前模块的注入器中,模块下的所有组件都能直接注入使用。举个直观的例子,你在组件里这么写的时候:
constructor(private fb: FormBuilder) {}
这个FormBuilder并不是你手动注册的,而是ReactiveFormsModule替你在DI系统里注册好了的。你不需要额外在组件或模块的providers里声明它,导入模块这一步就已经完成了依赖提供的工作。
- 对比一下你自己写的自定义服务:如果是你自己开发的服务,确实需要在
providers里注册(或者用providedIn: 'root'这种元数据配置),但官方提供的这类功能模块(比如ReactiveFormsModule、HttpClientModule)都已经封装好了依赖注入的配置,我们只需要导入就能直接用。
简单来说,就是Angular官方已经把响应式表单的DI配置打包进ReactiveFormsModule里了,你导入模块的动作就等同于告诉DI系统“我要使用这些表单服务”,所以不用手动加providers也能正常运行。
内容的提问来源于stack exchange,提问作者user603563
相关产品推荐
相关产品推荐

