【问题标题】:Angular dependency injection: providers vs importsAngular 依赖注入:提供者与导入
【发布时间】:2018-08-21 00:04:49
【问题描述】:

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

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

现在这可行(我有一个反应形式),但如何?在 Component providers 数组或其包含的 NgModule 提供程序数组中没有 FormBuilder 的“提供程序”。然而,Angular DI 文档坚持提供者数组是为 DI 注册某些东西的唯一方法。这是怎么回事?一些注入的东西怎么可能不需要在providers数组中?

提前致谢。


更新答案

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

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

【问题讨论】:

  • 看看这个github.com/angular/angular/blob/master/packages/forms/src/…,所以如果你导入 ReactiveFormsModule 你将能够注入 FormBuilder
  • 感谢您的评论,但是为什么作为导入的东西的一部分的东西对 DI/注入器可用?我的问题不是“如何让 Reactive Forms 工作”,而是我如何在没有提供者的情况下进行注入?

标签: angular angular-reactive-forms angular-providers


【解决方案1】:

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

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

这是 Angular 使用的模块模式。我们使用modules 将特征组为 (service, pipe, directive, routes and components) 及其依赖项。

docs 他们说:

NgModules 配置注入器和编译器,并帮助将相关的东西组织在一起。

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

【讨论】:

  • 这很有帮助...你能指出这是记录在哪里吗?我们如何猜测哪些模块不需要将其元素放入 providers 数组中才能被组件使用(例如 ReactiveFormsModule 的 FormBuilder),哪些需要?
  • 我会接受这一点,因为它指出了我正在寻找的答案(我把我的问题编辑了)。
猜你喜欢
  • 2021-04-23
  • 2014-11-07
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多