Подтвердить что ты не робот

Как запустить валидаторы формы в angular2

В angular2 Я хочу запускать Validators для некоторых элементов управления, когда изменяется другой элемент управления. Есть ли способ, которым я могу просто передать форму для повторной проверки? Еще лучше, могу ли я запросить проверку определенных полей?

Пример: Предоставлен флажок X и вход P. Вход P имеет валидатор, который ведет себя по-разному в зависимости от значения модели X. Когда X отмечен/непроверен, мне нужно вызвать валидатор на P. Валидатор на P будет смотреть на модель, чтобы определить состояние X и соответственно будет проверять P.

Вот код:

constructor(builder: FormBuilder) {
    this.formData = { num: '', checkbox: false };

    this.formGp = builder.group({
        numberFld: [this.formData.num, myValidators.numericRange],
        checkboxFld: [this.formData.checkbox],
    });
}

this.formGp.controls['checkboxFld'].valueChanges.observer({
    next: (value) => {
        // I want to be able to do something like the following line:
        this.formGp.controls['numberFld'].validator(this.formGp.controls['numberFld']);
    }
});

У кого-нибудь есть решение? Спасибо!

4b9b3361

Ответ 1

Я не знаю, если вы все еще ищете ответ, так вот мои предложения:

Посмотрите на это: Angular 2 - AbstractControl

Я думаю, что вы можете сделать следующее:

this.formGp.controls['checkboxFld'].valueChanges.observer({
    next: (value) => {
       this.formGp.controls['numberFld'].updateValueAndValidity();
    }
});

Это должно запускать и запускать валидаторы. Кроме того, государство также обновляется. Теперь вы должны иметь возможность проконсультироваться со значением флажка в своей логике проверки.

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

EDIT: обновленная ссылка и пример. Код изменился, когда я писал свой ответ.

EDIT_2: alpha.48 изменяет EventEmitter.observer на EventEmitter.subscribe!

Ответ 2

с моей ControlGroup я делаю это, потому что у меня есть проверка ошибок div, если коснулся

for (var i in this.form.controls) {
  this.form.controls[i].markAsTouched();
}

(this.form - моя контрольная группа)

Ответ 3

Есть более элегантные способы моделирования этого поведения - например, помещение вашего состояния в ReplaySubject и наблюдение за ним, а затем использование асинхронных валидаторов, наблюдающих за состоянием, но ниже должен использоваться псевдокодированный подход ниже. Вы просто наблюдаете изменения значений в флажке, обновляете модель по мере необходимости, а затем принудительно повторно проверяете номер Fld с помощью updateValueAndValidity cal.

constructor(builder: FormBuilder) {
  this.formData = { num: '', checkbox: false };
  const numberFld = builder.control(this.formData.num, myValidators.numericRange);

  const checkbox = builder.control(this.formData.checkbox);
  checkbox.valueChanges.map(mapToBoolean).subscribe((bool) => {
    this.formData.checked = bool;
    numberFld.updateValueAndValidity(); //triggers numberFld validation
  });

  this.formGp = builder.group({
      numberFld: numberFld,
      checkboxFld: checkbox
  });
}