typescript - Ionic3/Angular Hata: 'jobStatus' adındaki form kontrolü için bir değer sağlanmalıdır
Şablon işaretlemesinde aşağıdaki kodla bir Modal Formum var
<form [formGroup]="modalFG">
...
<ion-item *ngIf="isChangeStatus()">
<ion-select formControlName="jobStatus"
(ionChange)="jobStatusChangeHandler($event)">
<ion-option value=4>Success</ion-option>
<ion-option value=5>Failure</ion-option>
<ion-option value=6>Terminated</ion-option>
<ion-option value=8>Inactive</ion-option>
</ion-select>
</ion-item>
</form>
Typescript'te bir değer belirttim, ama bu hatayı aşamıyorum.
Hata: 'jobStatus' adlı form kontrolü için bir değer sağlanmalıdır.
Bana neyi yanlış yaptığımı söyleyebilir mi biri?
...
private modalFG:FormGroup;
private jobStatus:number;
constructor(
private navParams:NavParams,
private view:ViewController,
private fb: FormBuilder,
...
) {
this.changeStatus = false;
this.modalFG = fb.group({
comment: ['', Validators.required],
jobStatus: this.jobStatus
});
}
private ionViewWillLoad():void {
const data = this.navParams.get('data');
this.modalFG.setValue({'jobStatus': this.jobStatus});
}
private jobStatusChangeHandler(ev:any) {
console.log(ev);
}
private isChangeStatus():boolean {
return this.changeStatus;
}
Bununla gönderim için bir düğme işleyicim de var:
this.exitData.jobStatus = this.modalFG.get('jobStatus').value;
this.view.dismiss(this.exitData);
Bu tam hata mesajıdır:
Error: Must supply a value for form control with name: 'jobStatus'.
at http://localhost:8100/build/vendor.js:22102:23
at http://localhost:8100/build/vendor.js:22026:66
at Array.forEach (<anonymous>)
at FormGroup._forEachChild (http://localhost:8100/build/vendor.js:22026:36)
at FormGroup._checkAllValuesPresent (http://localhost:8100/build/vendor.js:22100:14)
at FormGroup.setValue (http://localhost:8100/build/vendor.js:21907:14)
at ModalPage.webpackJsonp.124.ModalPage.ionViewWillLoad (http://localhost:8100/build/main.js:648:22)
at ModalImpl.ViewController._lifecycle (http://localhost:8100/build/vendor.js:17471:33)
at ModalImpl.ViewController._willLoad (http://localhost:8100/build/vendor.js:17331:14)
at OverlayPortal.NavControllerBase._willLoad (http://localhost:8100/build/vendor.js:44112:18)
Çağrı yığını ionViewWillLoad diyor, bu yüzden hatanın bildiğim kadarıyla o bölümde bir şey olması gerekiyor!
Cevap #1
Benim problemim, tüm form kontrol değerlerini sağlamıyor olmamdı. Örneğin:
<div formGroupName="form">
<input formControlName="first">
<input formControlName="second">
</div>
Bu durumda, eğer setValue metodunu kullanmayı denerseniz ve tüm kontrol değerlerini sağlamazsanız, şöyle:
this.form.setValue({ second: "" });
bir hata verecek.
Çözüm
Ya setValue kullanın ve tüm form kontrolleri için değer sağlayın:
this.form.setValue({ first: "", second: "" });
veya gerçekten kısmi değerler ayarlamayı düşünüyorsanız, patchValue yöntemini kullanın:
this.form.patchValue({ second: "" });
Cevap #2
Doğru... Eskiden sadece 'yorum' adlı tek bir form kontrolüne sahip bir formum vardı.
İkinci, koşullu bir form öğesi eklediğimde, setValue için kullanmanız gereken sözdizimi değişiyor...
Bunu şöyle bir şeyden değiştirmem gerekiyordu:
this.modalFG.setValue({'comment': data.comment});
this.modalFG.setValue({'jobStatus': 0});
için :
this.modalFG.controls['jobStatus'].setValue(0);
this.modalFG.controls['comment'].setValue(data.comment);
çünkü artık formda iki alanım vardı...
Sonra her şey yerine oturdu ve form alanının sağlanmadığına dair yanıltıcı mesaj kayboldu.
Angular'ın burada kullandığı sözdiziminden nefret ediyorum, 1 değerden n değerlere geçtiğinizde işlevsel davranışını değiştirmesi!
