Ось ще один варіант, який мені вдалося придумати, що не залежить від цілого або підрозділу, ControlGroup
а прив’язується безпосередньо до кожного Control
.
Проблема у мене була елементи управління , які залежали один від одного не було ієрархічно разом , так що я не зміг створити ControlGroup
. Також у моєму CSS було встановлено, що кожен елемент керує існуючими кутовими класами, щоб визначити, чи відображати стилістику помилок, що було складніше при роботі з груповою валідацією замість перевірки конкретного контролю. Спроба визначити, чи був єдиний контроль дійсним, неможливо, оскільки перевірка була прив'язана до групи елементів контролю, а не до кожного окремого контролю.
У моєму випадку я хотів, щоб значення поля вікна було визначити, потрібне інше поле чи ні.
Це побудовано за допомогою Builder форм на компоненті. Для обраної моделі замість того, щоб безпосередньо прив’язувати її до значення об'єкта запиту, я зв'язав її для отримання / встановлення функцій, які дозволять мені обробляти події "на зміну" для управління. Тоді я зможу вручну встановити валідацію для іншого елемента управління залежно від вибору елементів управління новим значенням.
Ось відповідна частина перегляду:
<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 => ...))