gpt4 book ai didi

Angular 依赖注入(inject) : providers vs imports

转载 作者:行者123 更新时间:2023-12-05 06:36:10 25 4
gpt4 key购买 nike

有关依赖注入(inject)的 Angular 文档让我感到困惑。
我知道 Angular DI 的工作原理是通过传递给 NgModule(对于整个模块)或 Component(对于那个组件)的元数据对象上的 providers 数组向 DI(注入(inject)器)指定要“提供”的东西。

这个问题特定于响应式表单,但在响应式表单的 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
}
}

现在这行得通了(我有一个响应式(Reactive)工作),但是怎么做呢?在 Component providers 数组或其包含的 NgModule providers 数组中,FormBuilder 没有“provider”。然而 Angular DI 文档坚持 providers 数组是为 DI 注册某些东西的唯一方法。这是怎么回事?一些注入(inject)的东西怎么可能不需要在 providers 数组中呢?

提前致谢。


更新答案

啊!我从供应商页面看到:“当你导入一个有提供者的模块时,这些提供者也可用于应用程序中的所有类,只要它们有查找 token 。例如,如果你将 HttpClientModule 导入你的 AppModule,它的提供者然后可用于整个应用程序,您可以从应用程序中的任何位置发出 HTTP 请求。” https://angular.io/guide/providers

我没有意识到导入模块的提供者会自动成为导入模块的提供者。

最佳答案

ReactiveFormsModule 提供了FormBuilder 服务。因此,当您在模块中 imports: [ReactiveFormsModule] 时,您也提供了 FormBuilder

FormBuilderReactiveFormsModule 的一个特性。它就像您添加到应用程序中的任何其他模块一样。您可以看到此行为的另一个是 MatDialog 服务,它由 MatDialogModule 提供。

这是 Angular 使用的模块模式。我们使用 modules 将功能分组为(服务、管道、指令、路由和组件)及其依赖项。

docs他们说:

NgModules configure the injector and the compiler and help organize related things together.

正如用户指出的:“导入模块的提供者自动成为导入模块的提供者。”

关于 Angular 依赖注入(inject) : providers vs imports,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49244212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com