Вот еще один вариант, который мне удалось придумать, не зависящий от целого или вспомогательного ControlGroup а напрямую привязан к каждому Control.
Проблема, с которой я столкнулся, заключалась в том, что элементы управления, которые зависели друг от друга, не были иерархически вместе, поэтому я не смог создать ControlGroup. Кроме того, мой CSS был настроен так, что каждый элемент управления будет использовать существующие классы angular, чтобы определить, отображать ли стиль ошибки, что было более сложным при работе с групповой проверкой, а не с проверкой конкретного элемента управления. Попытка определить, был ли действителен отдельный элемент управления, была невозможна, поскольку проверка была привязана к группе элементов управления, а не к каждому отдельному элементу управления.
В моем случае я хотел, чтобы значение поля выбора определяло, требуется ли другое поле или нет.
Это создается с помощью конструктора форм в компоненте. Для модели выбора вместо того, чтобы напрямую связывать ее со значением объекта запроса, я связал ее с функциями получения / установки, которые позволят мне обрабатывать события «при изменении» для элемента управления. Затем я смогу вручную установить проверку для другого элемента управления в зависимости от нового значения элемента управления select.
Вот соответствующая часть просмотра:
<select [ngFormControl]="form.controls.employee" [(ngModel)]="employeeModel">
<option value="" selected></option>
<option value="Yes">Yes</option>
<option value="No">No</option>
</select>
...
<input [ngFormControl]="form.controls.employeeID" type="text" maxlength="255" [(ngModel)]="request.empID" />
Соответствующая составная часть:
export class RequestComponent {
form: ControlGroup;
request: RequestItem;
constructor(private fb: FormBuilder) {
this.form = fb.group({
employee: new Control("", Validators.required),
empID: new Control("", Validators.compose([Validators.pattern("[0-9]{7}"]))
});
get employeeModel() {
return this.request.isEmployee;
}
set employeeModel(value) {
this.request.isEmployee = value;
if (value === "Yes") {
this.form.controls["empID"].validator = Validators.compose([Validators.pattern("[0-9]{7}"), Validators.required]);
this.form.controls["empID"].updateValueAndValidity();
}
else {
this.form.controls["empID"].validator = Validators.compose([Validators.pattern("[0-9]{7}")]);
this.form.controls["empID"].updateValueAndValidity();
}
}
}
В моем случае у меня всегда была проверка шаблона, привязанная к элементу управления, поэтому validatorвсегда установлено что-то, но я думаю, вы можете установитьvalidator значение null, если у вас нет проверки, привязанной к элементу управления.
ОБНОВЛЕНИЕ. Существуют и другие методы регистрации изменений модели, например (ngModelChange)=changeFunctionName($event)подписка на изменения контрольных значений с помощьюthis.form.controls["employee"].valueChanges.subscribe(data => ...))