Reactive Forms - mark fields as touched

后端 未结 19 1536
旧时难觅i
旧时难觅i 2020-12-04 23:15

I am having trouble finding out how to mark all form\'s fields as touched. The main problem is that if I do not touch fields and try to submit form - validation error in not

19条回答
  •  庸人自扰
    2020-12-04 23:49

    See this gem. So far the most elegant solution I've seen.

    Full code

    import { Injectable } from '@angular/core';
    import { FormGroup } from '@angular/forms';
    
    const TOUCHED = 'markAsTouched';
    const UNTOUCHED = 'markAsUntouched';
    const DIRTY = 'markAsDirty';
    const PENDING = 'markAsPending';
    const PRISTINE = 'markAsPristine';
    
    const FORM_CONTROL_STATES: Array = [TOUCHED, UNTOUCHED, DIRTY, PENDING, PRISTINE];
    
    @Injectable({
      providedIn: 'root'
    })
    export class FormStateService {
    
      markAs (form: FormGroup, state: string): FormGroup {
        if (FORM_CONTROL_STATES.indexOf(state) === -1) {
          return form;
        }
    
        const controls: Array = Object.keys(form.controls);
    
        for (const control of controls) {
          form.controls[control][state]();
        }
    
        return form;
      }
    
      markAsTouched (form: FormGroup): FormGroup {
        return this.markAs(form, TOUCHED);
      }
    
      markAsUntouched (form: FormGroup): FormGroup {
        return this.markAs(form, UNTOUCHED);
      }
    
      markAsDirty (form: FormGroup): FormGroup {
        return this.markAs(form, DIRTY);
      }
    
      markAsPending (form: FormGroup): FormGroup {
        return this.markAs(form, PENDING);
      }
    
      markAsPristine (form: FormGroup): FormGroup {
        return this.markAs(form, PRISTINE);
      }
    }
    

提交回复
热议问题