Search code examples
angulartypescriptangular-reactive-forms

Reactive forms: mark dirty all controls in form group


I have Angular 6 app with form. Here is an examle

export class ExampleComponent implements OnInit {
    form: FormGroup;

    constructor(private fb: FormBuilder) { }

    ngOnInit() {
        this.form = new FormGroup({
            first: new FormControl(),
            last: new FormControl()
        });

        this.markControlsAsDirty(this.form);
    }

    markControlsAsDirty(form: FormGroup) {
        this.form.get('first').markAsDirty();
        this.form.get('last').markAsDirty();
    }
}

I don't want to get a single control and mark every field. Can I mark all controls in form group as dirty?

UPDATE I've been added stackblitz example to show that two previous answers were wrong


Solution

  • If you have a complicated form structure, you can segregate the code to mark FormGroup, FormArray or FormControl as dirty. See the example here : Mark Form as dirty

    markDirty() {
      this.markGroupDirty(this.form);
      console.log('FORM:', this.form);
    }
    markGroupDirty(formGroup: FormGroup) {
      Object.keys(formGroup.controls).forEach((key) => {
        switch (formGroup.get(key).constructor.name) {
          case 'FormGroup':
            this.markGroupDirty(formGroup.get(key) as FormGroup);
            break;
          case 'FormArray':
            this.markArrayDirty(formGroup.get(key) as FormArray);
            break;
          case 'FormControl':
            this.markControlDirty(formGroup.get(key) as FormControl);
            break;
        }
      });
    }
    markArrayDirty(formArray: FormArray) {
      formArray.controls.forEach((control) => {
        switch (control.constructor.name) {
          case 'FormGroup':
            this.markGroupDirty(control as FormGroup);
            break;
          case 'FormArray':
            this.markArrayDirty(control as FormArray);
            break;
          case 'FormControl':
            this.markControlDirty(control as FormControl);
            break;
        }
      });
    }
    markControlDirty(formControl: FormControl) {
      formControl.markAsDirty();
    }