Artportrait, я ненавижу ясно и установить валидаторы. FormControl недействителен, если он недопустим и включен, поэтому я думаю, что лучше отключить или нет
Для отключения FormControl мы можем использовать директиву - недопустимо при использовании [disabled]="variable"
- см. SO ответ
Во избежание 20 полей флага вы можете использовать простой массив. Если ваш массив, например,
fields=['firstName','streetName','state','zip']
Ваши элементы управления в форме могут быть (обратите внимание, что вы не используете * ngIf иначе display.none)
<ng-container [style.display]="fields.indexOf('firstName')<0?'none':''">
first name :
<input formControlName='firstName'
[enabledControl]="fields.indexOf('firstName')>=0?'>
</ng-container>
Другой подход действительно каждый раз создайте новую группу formGroup. Используя тот же массив, мы можем иметь функцию createForm
createForm(fields)
{
const form=new FormGroup({});
if (fields.indexOf('firstName')>=0)
form.addControl('firstName',new FormControl('', [Validators.maxLength(50), PhoneNumberValidator]]
if (fields.indexOf('phoneNumber')>=0)
form.addControl('phoneNumber',new FormControl('', [Validators.maxLength(50), PhoneNumberValidator]]
....
return form
}
И наши входные данные, такие как
<ng-container *ngIf="fields.indexOf('firstName')>=0"
first name :
<input formControlName='firstName'>
</ng-container>
, другой подход - это создание динамических c форм, как, например, Ploch ie, но это подход, который добавляет в приложение комплекс, который нам нужно оценить (в документах у вас есть способ сделать это)