Вот еще один вариант, который мне удалось придумать, не зависящий от целого или вспомогательного 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 => ...))