Как запустить валидаторы формы в 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']);
}
});
У кого-нибудь есть решение? Спасибо!
Ответы
Ответ 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
});
}