【问题标题】:Angular - No provider for FormBuilderAngular - 没有 FormBuilder 的提供者
【发布时间】:2021-10-26 18:40:58
【问题描述】:

我正在使用 Angular 9。

我收到以下错误:

没有 FormBuilder 的提供者

在很多情况下都被报道过,一般的解决方案似乎是将FormsModule添加到app.module.ts文件中。

例如

import { FormsModule } from '@angular/forms';

  imports: [
    FormsModule

我已经尝试过了,但仍然出现错误。

ERROR Error: Uncaught (in promise): NullInjectorError: R3InjectorError(AppModule)[FormBuilder -> FormBuilder -> FormBuilder]:

  NullInjectorError: No provider for FormBuilder!
NullInjectorError: R3InjectorError(AppModule)[FormBuilder -> FormBuilder -> FormBuilder]: 
  NullInjectorError: No provider for FormBuilder!

问题

我可能在做一些在 Angular 9 中有所改变的事情吗?我需要做什么来解决这个问题?

我的代码:

login.component.ts

import { Component, OnInit } from '@angular/core';
import {Router} from '@angular/router';
import { FormGroup, FormBuilder } from '@angular/forms';
import { AuthService } from '../../services/auth.service';

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.css']
})
export class LoginComponent implements OnInit {

  loginForm: FormGroup;

  constructor(private authService: AuthService, private formBuilder: FormBuilder, private router: Router) {
  }

  ngOnInit(): void {
    this.loginForm = this.formBuilder.group({
      username: [''],
      password: ['']
    });
  }

  get f() { return this.loginForm.controls; }

  login() {
    this.authService.login(
      {
        username: this.f.username.value,
        password: this.f.password.value
      }
    )
    .subscribe(success => {
      if (success) {
        this.router.navigate(['/secret-random-number']);
      }
    });
  }

}

app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { LoginComponent } from './auth/containers/login/login.component';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { FlexLayoutModule } from '@angular/flex-layout';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
import { MatToolbarModule } from '@angular/material/toolbar';
import { FormsModule } from '@angular/forms';
import { ApprovalListComponent } from './approval-list/component/approval-list.component';
import { MatTableModule } from '@angular/material/table';
import { MatPaginatorModule } from '@angular/material/paginator';
import { MatSortModule } from '@angular/material/sort';
import { MatTableExporterModule } from 'mat-table-exporter';

@NgModule({
  declarations: [
    AppComponent,
    LoginComponent,
    ApprovalListComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    HttpClientModule,
    BrowserAnimationsModule,
    FlexLayoutModule,
    MatFormFieldModule,
    MatInputModule,
    MatButtonModule,
    MatCardModule,
    MatToolbarModule,
    FormsModule,
    MatTableModule,
    MatPaginatorModule,
    MatSortModule,
    MatTableExporterModule
  ],
  providers: [LoginComponent],
  bootstrap: [AppComponent]
})
export class AppModule { }

【问题讨论】:

标签: javascript angular


【解决方案1】:

表单生成器是ReactiveFormsModule

import { ReactiveFormsModule } from '@angular/forms';

  imports: [
    ReactiveFormsModule

您还需要此模块才能使用 formGroupformControl 指令。

【讨论】:

    【解决方案2】:

    在我的情况下,通过以下步骤解决:

    首先将其添加到 app.module.ts 中

    import { FormBuilder } from '@angular/forms';
    

    第二次添加FormBuilder

      providers: [
        StatusBar,
        SplashScreen,
        FormBuilder,
    

    【讨论】:

      【解决方案3】:

      我通过在app.module.ts 中添加FormsModuleReactiveFormsModule 来解决此问题(我缺少ReactiveFormsModule):

      import { FormsModule, ReactiveFormsModule } from '@angular/forms';
      
        imports: [
      
          FormsModule,
          ReactiveFormsModule,
      

      【讨论】:

      • 仅供参考,如果您使用的是ngModel 或模板驱动的表单,则只需要FormsModule。如果您只是使用反应式/模型驱动的表单,则不需要导入该模块。就个人而言,我通常坚持每个项目使用一种表单样式,但这更多的是偏好问题。
      【解决方案4】:
      TestBed.configureTestingModule({
            declarations: [ LoginComponent ],
            providers: [
              FormBuilder
            ],
          })...
      

      【讨论】:

      • 感谢您的贡献。考虑为您的代码添加解释,因为这样会更有帮助。
      【解决方案5】:

      就我而言,我忘记在主父 app.module.ts 模块文件中导入 FormsModuleReactiveFormsModule

      imports: [
          FormsModule,
          ReactiveFormsModule
      
      ],
      

      另外,添加您当前的模块文件。

      sub.module.tsFormsModuleReactiveFormsModule

      imports: [
          FormsModule,
          ReactiveFormsModule
      
      ],
      

      【讨论】:

        猜你喜欢
        • 2022-07-24
        • 2017-03-08
        • 2022-01-11
        • 2015-08-15
        • 2019-05-15
        • 2018-11-17
        • 2018-08-04
        • 2018-06-21
        相关资源
        最近更新 更多