Voici une autre option que j'ai pu proposer qui ne dépend pas d'un sous-ensemble ou d'un sous-marin ControlGroup
mais est directement liée à chacun Control
.
Le problème que j'avais était que les contrôles qui dépendaient les uns des autres n'étaient pas hiérarchiquement ensemble, donc je n'ai pas pu créer un fichier ControlGroup
. De plus, mon CSS a été configuré pour que chaque contrôle exploite les classes angulaires existantes pour déterminer s'il faut afficher le style d'erreur, ce qui était plus compliqué lorsqu'il s'agissait d'une validation de groupe au lieu d'une validation spécifique au contrôle. Essayer de déterminer si un seul contrôle était valide n'était pas possible puisque la validation était liée au groupe de contrôles et non à chaque contrôle individuel.
Dans mon cas, je voulais la valeur d'une boîte de sélection pour déterminer si un autre champ serait requis ou non.
Ceci est construit à l'aide du générateur de formulaires sur le composant. Pour le modèle de sélection au lieu de le lier directement à la valeur de l'objet de requête, je l'ai lié pour obtenir / définir des fonctions qui me permettront de gérer les événements "sur modification" pour le contrôle. Ensuite, je pourrai définir manuellement la validation d'un autre contrôle en fonction de la nouvelle valeur des contrôles de sélection.
Voici la partie de la vue pertinente:
<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" />
La partie composante pertinente:
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();
}
}
}
Dans mon cas, j'ai toujours eu une validation de modèle liée au contrôle, donc le validator
est toujours défini sur quelque chose, mais je pense que vous pouvez définir le validator
sur null si vous n'avez aucune validation liée au contrôle.
MISE À JOUR: Il existe d'autres méthodes pour capturer le changement de modèle comme (ngModelChange)=changeFunctionName($event)
ou souscrire pour contrôler les changements de valeur en utilisantthis.form.controls["employee"].valueChanges.subscribe(data => ...))