如何将 Reactive FormGroup 与 Angular Material 一起使用

Rah*_*gli 6 angular-material angular

我正在使用带有 Angular Material 设计的反应式表单组。但是,我收到一个错误:

错误类型错误:无法读取未定义的属性“无效”

指向这行代码:

<input formControlName="fieldName" ngDefaultControl matInput placeholder="Field Name">
<mat-error *ngIf="fieldName.invalid">
  Field name is required
</mat-error>
Run Code Online (Sandbox Code Playgroud)

TS:

export class AddFieldComponent implements OnInit {
  form: FormGroup;

  constructor(public fb: FormBuilder) {
      this.form = this.fb.group({
        fieldName: ['', Validators.required],
        fieldType: ['', Validators.required]
      });
    }
  }
Run Code Online (Sandbox Code Playgroud)

HTML

<div [formGroup]="form" class="add-field">
  <div mat-dialog-content>
    <h2>Add Fields</h2>
    <mat-form-field>
      <input formControlName="fieldName" ngDefaultControl matInput placeholder="Field Name">
      <mat-error *ngIf="fieldName.invalid">
        Field name is required
      </mat-error>
    </mat-form-field>
    <mat-form-field>
      <mat-select formControlName="fieldType">
        <mat-option value="text-field">Text Field</mat-option>
        <mat-option value="radio-btn">Radio Button</mat-option>
      </mat-select>
    </mat-form-field>
  </div>
  <div mat-dialog-actions>
    <span class="right-align-next-element"></span>
    <button class="secondary-btn" mat-button (click)="closeModal()">Cancel</button>
    <button [disabled]="fieldName.invalid" class="primary-btn" mat-button (click)="addFields()" cdkFocusInitial>Add field</button>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

Ruk*_*lla 1

您有两个选择。

选项1

使用 div 或 span 包裹元素并进行以下检查

*ngIf="fieldName && fieldName.invalid"
Run Code Online (Sandbox Code Playgroud)

选项2

始终使用:

fieldName?.invalid
Run Code Online (Sandbox Code Playgroud)

当你想访问fieldName的无效属性时

  • 这个答案在 2018 年可能是正确的,但在 2019 年我可以说这个答案具有误导性,因为它只告诉了如何抑制错误,但没有告诉如何修复它。作者的问题在于他错误地访问了该属性。他的代码假设 fieldName 是组件上的属性,但事实并非如此,这就是它未定义的原因。访问该属性的正确方法是 form.controls.fieldName。FormGroup 上的“controls”字段是包含所有 FormControl 实例的对象 (9认同)