Oto kolejna opcja, którą udało mi się wymyślić, która nie zależy od całości lub sub, ControlGroupale jest bezpośrednio powiązana z każdym z nich Control.
Problem, który miałem, polegał na tym, że kontrolki, które były od siebie zależne, nie były hierarchicznie połączone, więc nie mogłem utworzyć pliku ControlGroup. Ponadto, mój CSS został skonfigurowany tak, że każda kontrolka wykorzystywałaby istniejące klasy kątowe, aby określić, czy wyświetlać style błędów, co było bardziej skomplikowane w przypadku walidacji grupowej zamiast walidacji specyficznej dla kontrolki. Próba ustalenia, czy pojedyncza kontrola była ważna, nie była możliwa, ponieważ walidacja była powiązana z grupą kontroli, a nie z każdą indywidualną kontrolą.
W moim przypadku chciałem, aby wartość pola wyboru określała, czy inne pole będzie wymagane, czy nie.
Jest to tworzone przy użyciu konstruktora formularzy w komponencie. W przypadku modelu wyboru zamiast bezpośredniego powiązania go z wartością obiektu żądania powiązałem go z funkcjami pobierania / ustawiania, które pozwolą mi obsługiwać zdarzenia „przy zmianie” dla kontrolki. Wtedy będę mógł ręcznie ustawić walidację dla innej kontrolki w zależności od nowej wartości wybranych kontrolek.
Oto odpowiednia część widoku:
<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" />
Odpowiednia porcja składnika:
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();
}
}
}
W moim przypadku zawsze miałem walidację wzorca powiązaną z kontrolką, więc validatorjest zawsze ustawiona na coś, ale myślę, że możesz ustawić na validatornull, jeśli nie masz żadnej walidacji powiązanej z kontrolką.
AKTUALIZACJA: Istnieją inne metody przechwytywania zmian modelu, takie jak (ngModelChange)=changeFunctionName($event)lub subskrybowanie zmian wartości kontrolnych przy użyciuthis.form.controls["employee"].valueChanges.subscribe(data => ...))