У меня есть список строк, каждая из которых содержит несколько селекторов, входных данных и флажок, который выглядит следующим образом
<mat-checkbox [(ngModel)]="chargeApply[charge]" [ngModelOptions]="{standalone: true}"
(change)="setChargeValidators(charge, $event.checked)"></mat-checkbox>
Цель состоит в том, чтобы setChargeValidators добавили / удалили валидаторы для выбранной строки /невыбранный, это функция (есть много дополнительных вещей, которые отлично работают, которые я не объясняю о функции, важная часть - очистка валидаторов, когда выбран false, а CELL_VALIDATION - массив, содержащий Validators.required):
setChargeValidators(charge: string, selected: boolean) {
if (selected) {
this.chargesSelected = true;
this.chargesForm.controls[charge + '20'].setValidators(CELL_VALIDATION);
this.chargesForm.controls[charge + '40'].setValidators(CELL_VALIDATION);
this.chargesForm.controls[charge + '40hc'].setValidators(CELL_VALIDATION);
this.chargesForm.controls[charge + 'Currency'].setValidators(Validators.required);
this.chargesForm.controls[charge + 'Unit'].setValidators(Validators.required);
} else {
const controlNames = ['20', '40', '40hc', 'Currency', 'Unit'];
for (let name of controlNames) {
if (name !== 'Currency' ) {
this.chargesForm.controls[charge + name].reset();
}
this.chargesForm.controls[charge + name].clearValidators();
}
for (let chargeName in this.chargeApply) {
if (this.chargeApply[chargeName]) {
return;
}
}
this.chargesSelected = false;
}
this.updateForm(charge);}
UpdateForm выглядит следующим образом
updateForm(charge) {
const controlNames = ['20', '40', '40hc', 'Currency', 'Unit'];
for (let name of controlNames) {
this.chargesForm.controls[charge + name].updateValueAndValidity();
// debugger
}
}
Однако, когда я отменяю выбор строки, все FormControls этой строки имеют
ошибка: {обязательно: верно}
Кажется, что все валидаторы очищаются, за исключением Validators.required.Я пытался сделать
this.chargesForm.controls [charge + name] .clearAsyncValidators ();
В дополнение к clearValidators (), без эффекта (которыйимеет смысл, так как я не устанавливаю никакой асинхронной проверки).Я также попробовал Это решение без удачи.
Спасибо за ваше время.