【Angular】 중첩된 formGroup을 초기화하는 방법

9916 단어 Angular

이 기사 개요



중첩 된 폼 그룹의 유효성 검사 설정은 그대로 값을 초기화하고 싶을 때 폼 그룹의 항목이 많을 경우 하나 하나 patchValue 해가는 것은 어렵습니다.

그래서 중첩 양식 그룹의 초기 설정을 제거하고 setControl을 사용하여 초기화합니다.

구현


  parentForm: FormGroup;

  get fCtrl(): { [key: string]: AbstractControl } {
    return this.parentForm.controls;
  }

  get fChildCtrl(): { [key: string]: AbstractControl } {
    return (this.parentForm.controls.childGroup as FormGroup).controls;
  }

  constructor(
    private fb: FormBuilder
  ) { }

  ngOnInit() {
    this.parentForm = this.fb.group({
      id: [null],
      parentName: [null, [Validators.required]],
      childGroup: this.getDefaultChildForm()
    }, {
      updateOn: 'submit'
    });
  }

  /**
   * 子フォームグループの初期値取得.
   */
  private getDefaultChildForm(): FormGroup {
    return this.fb.group({
      childName: [null, [Validators.required]],
      childCount: [null, [Validators.required]]
    });
  }

  /**
   * 子フォームグループを初期値する.
   */
  onInitChildForm(): void {
    this.parentForm.setControl('childGroup', this.getDefaultChildForm());
  }

  onSubmit(): void {
    if (this.parentForm.invalid) {
      alert('invalid!');
      return;
    }
    // submit処理
  }
<mat-card>
  <form
    [formGroup]="parentForm"
    (ngSubmit)="onSubmit()">
    <mat-card-content>
      <mat-form-field class="form-element">
        <mat-label>parentName</mat-label>
        <input
          matInput
          formControlName="parentName">
        <mat-error *ngIf="!fCtrl.parentName.valid">必須項目です</mat-error>
      </mat-form-field>

      <div formGroupName="childGroup">
        <mat-form-field class="form-element">
          <mat-label>childName</mat-label>
          <input
            matInput
            formControlName="childName">
          <mat-error *ngIf="!fChildCtrl.childName.valid">必須項目です</mat-error>
        </mat-form-field>

        <mat-form-field class="form-element">
          <mat-label>childCount</mat-label>
          <input
            matInput
            formControlName="childCount">
          <mat-error *ngIf="!fChildCtrl.childCount.valid">必須項目です</mat-error>
        </mat-form-field>
      </div>

    </mat-card-content>

    <mat-card-actions>
      <button
        mat-raised-button
        type="submit"
        color="primary">
        登録
      </button>
      <button
        mat-raised-button
        type="button"
        (click)="onInitChildForm()"
        color="primary">
        子フォーム初期化
      </button>
    </mat-card-actions>
  </form>
</mat-card>

동작 확인



입력





초기화





등록 버튼 누르기



좋은 웹페이지 즐겨찾기