폼 그룹 에러처리 커스터마이징 (Customizing Form Group Error)

최대 1 분 소요

Angular의 FormControl 이나 FormGroup을 Material과 연동해서 사용하다보면 에러처리를 커스터마이징 해야할 때가 있습니다.
예를 들자면 동의 체크박스가 반드시 체크 되어야 하므로 체크가 되지 않으면 에러 메시지를 보여주어야 한다는 것 등입니다.

물론 별도로 검사하고 css 처리를 통해 메시지를 표시할 수 있겠으나
최대한 기본 설정을 유지한 채로 커스터마이징한 에러 처리를 하는 방법을 찾느라 여기저기 많은 사이트를 찾아보다가
이 방법이 가장 나을거 같아서 정리해보았습니다.

FormControl에서 에러처리

FormControl 에러 발생 방법은 해당 control에 setError를 주고 mat-error에 해당 필드의 hasError를 체크하면 됩니다.


<mat-form-field>
      <input [formControl]="testControl" #testControl type="text" />
      <mat-error *ngIf="testControl.hasError('testError')"*>에러발생</mat-error>
</mat-form-field>

// 에러 강제 발생
this.testControl.setError({testError: true});

FormGroup에서 에러처리


<form [formGroup]="testForm">
      <mat-form-field  class="full-width">
            <input  matInput  type="text"  formControlName="checkControl"  />
            <mat-error>* 인증코드를 확인해 주세요</mat-error>
      </mat-form-field>
</form>

// component
...
ngOnInit() {
  this.testForm  =  this.fb.group({
    checkControl: ['', []]
  });
}

customError() {
  this.testForm.get('checkControl').markAsTouched();
  this.testForm.get('checkControl').setErrors({incorrect: true});
}

유의점

  • 에러는 touch된 상황에서만 발생하므로 반드시 markAsToucked()를 우선 실행해야 합니다. 그렇지 않으면 setErrors 적용이 무시됩니다.
  • 에러를 취소하려면 setError(null) 또는 setError({incorrect: false}) 로 만들면 됩니다.
  • formGroup이 정상처리 되려면 모든 에러가 null 상태이어야 합니다.
  • 다른 예시 중에서 this.testForm.get(‘checkControl’).updateValueAndValidity({onlySelf: true, emitEvent: false}); 도 있었으나 적용하면 동작하지 않았습니다. 혹시 되시면 댓글 부탁 드립니다.

댓글남기기