关于依赖注入的 Angular 文档让我感到困惑。
我知道 Angular DI 的工作原理是通过传递给 NgModule(整个模块)或组件(仅针对该组件)的元数据对象上的提供程序数组指定要"提供"的东西。
这个问题不是特定于响应式表单的,但在反应式表单 angular.io 示例中,它的组件定义为(简化!
import {FormBuilder, FormGroup, Validators} from '@angular/forms';
@Component({
template: '<p>Hello world</p>'
})
export class DepInjectionExample
{
constructor(private formBuilder: FormBuilder)
{
//Use form builder here
}
}
现在这有效(我有一个反应式形式在工作),但是如何工作? FormBuilder没有"提供程序",无论是在组件提供程序数组中还是在其包含NgModule提供程序数组中。 然而,Angular DI 文档坚持认为提供程序数组是为 DI 注册某些内容的唯一方法。 这是怎么回事? 一些注入的东西怎么可能不需要在提供程序数组中?
提前谢谢。
更新答案
啊! 我从提供商页面看到: "当您导入具有提供程序的模块时,只要它们具有查找令牌,这些提供程序也可用于应用程序中的所有类。例如,如果您将 HttpClientModule 导入您的 AppModule,则其提供程序可用于整个应用程序,并且您可以从应用程序中的任何位置发出 HTTP 请求。 https://angular.io/guide/providers
我没有意识到导入模块的提供程序会自动成为导入模块的提供程序。
ReactiveFormsModule
提供了FormBuilder Service
。因此,当您imports: [ReactiveFormsModule]
模块时,您也提供了FormBuilder
。
FormBuilder
是ReactiveFormsModule
的一个特点。它就像您添加到应用程序的任何其他模块一样。您可以看到此行为的另一个是MatDialog
提供的服务MatDialogModule
.
这是 Angular 使用的模块模式。我们使用modules
将特征分组为(service, pipe, directive, routes and components
)及其依赖项。
在文档中,他们说:
NgModules 配置注入器和编译器,并帮助将相关内容组织在一起。
正如用户指出的那样:"导入模块的提供程序自动成为导入模块的提供程序。