Oto kolejna opcja, którą udało mi się wymyślić, która nie zależy od całości lub sub, ControlGroup
ale 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 validator
jest zawsze ustawiona na coś, ale myślę, że możesz ustawić na validator
null, 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 => ...))