Hier ist eine weitere Option, die ich mir ausgedacht habe und die nicht von einem Ganzen oder Sub abhängig ControlGroupist, sondern direkt an jedes gebunden ist Control.
Das Problem, das ich hatte, war, dass die Steuerelemente, die voneinander abhängig waren, nicht hierarchisch zusammen waren, sodass ich keine erstellen konnte ControlGroup. Außerdem wurde mein CSS so eingerichtet, dass jedes Steuerelement die vorhandenen Winkelklassen nutzt, um zu bestimmen, ob ein Fehlerstil angezeigt werden soll. Dies war komplizierter, wenn eine Gruppenvalidierung anstelle einer steuerungsspezifischen Validierung durchgeführt wurde. Der Versuch festzustellen, ob eine einzelne Kontrolle gültig war, war nicht möglich, da die Validierung an die Gruppe von Kontrollen und nicht an jede einzelne Kontrolle gebunden war.
In meinem Fall wollte ich, dass der Wert eines Auswahlfelds bestimmt, ob ein anderes Feld erforderlich ist oder nicht.
Dies wird mit dem Form Builder für die Komponente erstellt. Für das ausgewählte Modell habe ich es nicht direkt an den Wert des Anforderungsobjekts gebunden, sondern an Funktionen zum Abrufen / Festlegen gebunden, mit denen ich Ereignisse "bei Änderung" für das Steuerelement verarbeiten kann. Dann kann ich die Validierung für ein anderes Steuerelement manuell festlegen, abhängig vom neuen Wert der ausgewählten Steuerelemente.
Hier ist der relevante Ansichtsteil:
<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" />
Der relevante Komponententeil:
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();
}
}
}
In meinem Fall war immer eine Mustervalidierung an das Steuerelement gebunden, sodass das validatorimmer auf etwas gesetzt ist, aber ich denke, Sie können das validatorauf null setzen, wenn Sie keine Validierung an das Steuerelement gebunden haben.
UPDATE: Es gibt andere Methoden zum Erfassen der (ngModelChange)=changeFunctionName($event)Modelländerung, z. B. zum Abonnieren von Steuerwertänderungen mithilfe vonthis.form.controls["employee"].valueChanges.subscribe(data => ...))