Aquí hay otra opción que pude encontrar que no depende de un todo o sub, ControlGroupsino que está vinculada directamente a cada uno Control.
El problema que tuve fue que los controles que dependían entre sí no estaban juntos jerárquicamente, por lo que no pude crear un archivo ControlGroup. Además, mi CSS se configuró para que cada control aprovechara las clases angulares existentes para determinar si mostrar el estilo de error, que era más complicado cuando se trataba de una validación de grupo en lugar de una validación específica de control. No fue posible intentar determinar si un solo control era válido, ya que la validación estaba vinculada al grupo de controles y no a cada control individual.
En mi caso, quería el valor de un cuadro de selección para determinar si se requeriría otro campo o no.
Esto se construye usando el Form Builder en el componente. Para el modelo de selección, en lugar de vincularlo directamente al valor del objeto de solicitud, lo he vinculado para obtener / establecer funciones que me permitirán manejar eventos "al cambiar" para el control. Entonces podré configurar manualmente la validación para otro control dependiendo del nuevo valor de los controles seleccionados.
Aquí está la parte de la vista relevante:
<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 porción del componente relevante:
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();
}
}
}
En mi caso, siempre tuve una validación de patrón vinculada al control, por lo validatorque siempre se establece en algo, pero creo que puede establecerla validatoren nulo si no tiene ninguna validación vinculada al control.
ACTUALIZACIÓN: Existen otros métodos para capturar el cambio de modelo como (ngModelChange)=changeFunctionName($event)o suscribirse a cambios de valor de control mediante el uso dethis.form.controls["employee"].valueChanges.subscribe(data => ...))