Aqui está outra opção que consegui propor que não depende de um subtítulo ou inteiro, ControlGroup
mas está diretamente ligada a cada um Control
.
O problema que eu tinha era que os controles que eram dependentes um do outro não estavam hierarquicamente juntos, então não consegui criar um ControlGroup
. Além disso, meu CSS foi configurado para que cada controle aproveitasse as classes angulares existentes para determinar se exibia um estilo de erro, o que era mais complicado ao lidar com uma validação de grupo em vez de uma validação específica de controle. Tentar determinar se um único controle era válido não foi possível, uma vez que a validação foi vinculada ao grupo de controles e não a cada controle individual.
No meu caso, eu queria o valor de uma caixa de seleção para determinar se outro campo seria obrigatório ou não.
Isso é construído usando o Form Builder no componente. Para o modelo de seleção, em vez de vinculá-lo diretamente ao valor do objeto de solicitação, vinculei-o às funções get / set que me permitirão manipular eventos "on change" para o controle. Então, poderei definir manualmente a validação para outro controle, dependendo do novo valor dos controles selecionados.
Aqui está a parte relevante da visualização:
<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" />
A parte do 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();
}
}
}
No meu caso, sempre tive uma validação de padrão ligada ao controle, então o validator
é sempre definido como algo, mas acho que você pode definir o validator
como nulo se você não tiver nenhuma validação ligada ao controle.
ATUALIZAÇÃO: Existem outros métodos de captura da mudança do modelo, como (ngModelChange)=changeFunctionName($event)
ou inscrição para controlar as mudanças de valor, usandothis.form.controls["employee"].valueChanges.subscribe(data => ...))