İşte bulabildiğim, bir bütüne veya alt ControlGroupkısma bağlı olmayan, ancak doğrudan her birine bağlı olan başka bir seçenek Control.
Karşılaştığım sorun, birbirine bağımlı olan kontrollerin hiyerarşik olarak birlikte olmamasıydı, bu yüzden bir ControlGroup. Ayrıca, benim CSS'im, her bir denetimin hata stilinin görüntülenip görüntülenmeyeceğini belirlemek için mevcut açısal sınıflardan yararlanacağı şekilde ayarlanmıştı; bu, bir denetime özgü doğrulama yerine bir grup doğrulamasıyla uğraşırken daha karmaşıktı. Tek bir kontrolün geçerli olup olmadığını belirlemeye çalışmak, doğrulama her bir kontrole değil, kontrol grubuna bağlı olduğundan mümkün olmadı.
Benim durumumda, başka bir alanın gerekli olup olmayacağını belirlemek için bir seçim kutusu değerinin olmasını istedim.
Bu, bileşendeki Form Oluşturucu kullanılarak oluşturulur. Select modeli için, onu doğrudan istek nesnesinin değerine bağlamak yerine, kontrol için "on change" olaylarını işlememe izin verecek get / set işlevlerine bağladım. Daha sonra, seçilen kontrollerin yeni değerine bağlı olarak başka bir kontrol için doğrulamayı manuel olarak ayarlayabileceğim.
İşte ilgili görünüm kısmı:
<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" />
İlgili bileşen kısmı:
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();
}
}
}
Benim durumumda her zaman kontrole bağlı bir model doğrulamasına sahiptim, bu yüzden validatorher zaman bir şeye ayarlı, ancak validatorkontrole bağlı herhangi bir doğrulama yoksa bence null olarak ayarlayabilirsiniz .
GÜNCELLEME: Model değişikliğini yakalamanın (ngModelChange)=changeFunctionName($event)veya değer değişikliklerini kontrol etmeye abone olma gibi başka yöntemler de vardır.this.form.controls["employee"].valueChanges.subscribe(data => ...))