Угловая проверка ReactiveForms - PullRequest
0 голосов
/ 24 января 2019

У меня есть какая-то реактивная форма, подобная этой:

this.form = this.formBuilder.group({
      filter: [''],
      filterReason: [''],
      documentsRequired: [''],
      urgencyReason: [''],
      reportRequestedDate: [''],
      urgencyDate: [''],
      urgencyRemarks: ['']
    });

И какое-то значение, подобное этому:

validation = false;

У меня проблема в том, что мне нужно переключить значение этого validation в html, и на основании этого, если validation = true мне нужно добавить проверку в какое-то поле, которое будет выглядеть так:

this.form = this.formBuilder.group({
      filter: [''],
      filterReason: [''],
      documentsRequired: [''],
      urgencyReason: [''],
      reportRequestedDate: ['', Validation.required],
      urgencyDate: ['', Validation.required],
      urgencyRemarks: ['', Validation.required]
    });

Как это сделать, дажеу меня есть форма инициализации при рендеринге компонента?

Ответы [ 3 ]

0 голосов
/ 24 января 2019

в вашем html:

<button  (click)="toggleValidation();">toggle validation

</button>

в тс:

    toggleValidation(validation : boolean)
Object.keys(this.form).forEach(key=> {
this.form.get(key).setValidators(validation && key.*your condition* ? Validators.required : null); });}
0 голосов
/ 24 января 2019

Вот полный StackBlitz с ReactiveForms и динамической проверки .

Идея состоит в том, чтобы иметьsetter для свойства validation, так что вы можете переключать валидаторы каждый раз, когда свойство устанавливается с помощью myControl.setValidators(validate ? [Validators.required] : null), а затем обновлять его состояние действительности, вызывая myControl.updateValueAndValidity()

Два метода важны для вашего FormControl здесь:

  • setValidators ()
  • updateValueAndValidity ()
import { Component } from '@angular/core';
import { FormBuilder, FormControl, Validators } from '@angular/forms';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  form: any;
  private _validation = true;

  constructor(private formBuilder: FormBuilder) {
    this.form = this.formBuilder.group({
        filter: ['Hello'],
        filterReason: ['Test'],
        documentsRequired: ['Document'],
        urgencyReason: ['Nothing'],
        reportRequestedDate: [''],
        urgencyDate: ['Today'],
        urgencyRemarks: ['']
      });
      this.setValidators(this.validation);
  }

  set validation(validate: boolean) {
    this._validation = validate;
    this.setValidators(validate);
  }
  get validation(): boolean {
    return this._validation;
  }

  setValidators(validate: boolean): void {
    this.reportRequestedDate.setValidators(validate ? [Validators.required] : null);
    this.reportRequestedDate.updateValueAndValidity();

    this.urgencyDate.setValidators(validate ? [Validators.required] : null);
    this.reportRequestedDate.updateValueAndValidity();

    this.urgencyRemarks.setValidators(validate ? [Validators.required] : null);
    this.urgencyRemarks.updateValueAndValidity();
  }

  onSubmit(): void {
    if (this.form.valid) {
      console.log(this.form.value);
    }
  }

  get reportRequestedDate(): FormControl {
    return this.form.get('reportRequestedDate') as FormControl;
  }

  get urgencyDate(): FormControl {
    return this.form.get('urgencyDate') as FormControl;
  }

  get urgencyRemarks(): FormControl {
    return this.form.get('urgencyRemarks') as FormControl;
  }
}

Надеюсь, это поможет!

0 голосов
/ 24 января 2019

Angular предоставляет нам setValidators метод на AbstractControl, так что вы можете изменить набор валидаторов в зависимости от вашего состояния:

onValidationChanged(validation: boolean) {
  ['reportRequestedDate', 'urgencyDate', 'urgencyRemarks'].forEach(name => {
    this.form.get(name).setValidators(validation ? Validators.required : null);
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...