Ionic3/Angular Error: Must supply a value for form control with name: 'jobStatus'
Ionic3/Angular Error: Must supply a value for form control with name: 'jobStatus'
我有一个模态表单,在模板标记中包含以下代码
<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 中指定了一个值,但我无法克服这个错误。
错误:必须为名称为表单控件的值提供一个值:'jobStatus'。
谁能告诉我我做错了什么?
...
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;
}
我还有用于提交的按钮处理程序:
this.exitData.jobStatus = this.modalFG.get('jobStatus').value;
this.view.dismiss(this.exitData);
这是完整的错误信息:
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)
因为它在调用堆栈中显示了 ionViewWillLoad,所以错误一定出在那个部分 AFAIK!
这里
private jobStatus:number;
jobStatus 值为“undefined
”。
设置一个值:
private jobStatus:number = 0;
使其发挥作用。
对...
我有一个曾经只有一个表单控件的表单,称为 'comment'.
当我添加第二个条件表单元素时,您需要使用的语法更改为 setValue...
我需要像这样修改它:
this.modalFG.setValue({'comment': data.comment});
this.modalFG.setValue({'jobStatus': 0});
至:
this.modalFG.controls['jobStatus'].setValue(0);
this.modalFG.controls['comment'].setValue(data.comment);
因为我现在在表单上有两个字段...
然后一切就绪,关于未提供表单字段的误导性信息消失了。
我讨厌这里 Angular 的语法,当你从 1 到 n 值时改变它的功能行为!
我的问题是我没有提供所有表单控件值。例如:
<div formGroupName="form">
<input formControlName="first">
<input formControlName="second">
</div>
在这种情况下,如果您尝试使用方法 setValue
并且不提供所有控件值,如下所示:
this.form.setValue({ second: "" });
它会抛出一个错误。
解决方案
要么使用 setValue
并为所有表单控件提供值:
this.form.setValue({ first: "", second: "" });
或者,如果您确实打算设置部分值,请使用 patchValue
方法:
this.form.patchValue({ second: "" });
您也可以使用 patchValue 单独设置一个或多个输入:
this.form.patchValue({ first: "whatever" });
如果您只需要在表单组中设置一个 ctrl 值,您应该使用
this.formGroup.patchValue({})
,
如果您必须在您应该使用的表单组中设置所有 ctrl 值
this.formGroup.setValue({})
,
“必须提供”告诉您将值传递给表单上的对象。例如:
想象一下这个场景:
public form = this.fb.group({
production: this.fb.group({
name: [''],
id: [''],
screenName: [''],
})
});
当您从服务器收到此数据时,表单等待 3 个对象...“name”、“id”和“screenName”。 PatchValue 工作正常。
但是,如果你收到数据,你只有 2 个对象:“名称”和“屏幕名称”,你尝试这样做:
const formProduction = this.form.get('production');
formProduction.patchValue(this.yourData);
您可能会收到有关“必须申请”的消息,因为表格等待所有数据。发生这种情况,如果你强制执行 Cast,如下所示:
const formProduction = this.form.get('production');
formProduction.patchValue(this.yourData as YourObject);
在讨论顶部的这种情况下,private jobStatus:number 会导致相同的错误。
一个简单的修复方法是将其转换为未知:如果您的服务器不发送所有信息,angular 仅将收到的信息放入表单中,并忽略其他字段。
const formProduction = this.form.get('production');
formProduction.patchValue(this.yourData as unknown);
;-)
我有一个模态表单,在模板标记中包含以下代码
<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 中指定了一个值,但我无法克服这个错误。
错误:必须为名称为表单控件的值提供一个值:'jobStatus'。
谁能告诉我我做错了什么?
...
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;
}
我还有用于提交的按钮处理程序:
this.exitData.jobStatus = this.modalFG.get('jobStatus').value;
this.view.dismiss(this.exitData);
这是完整的错误信息:
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)
因为它在调用堆栈中显示了 ionViewWillLoad,所以错误一定出在那个部分 AFAIK!
这里
private jobStatus:number;
jobStatus 值为“undefined
”。
设置一个值:
private jobStatus:number = 0;
使其发挥作用。
对... 我有一个曾经只有一个表单控件的表单,称为 'comment'.
当我添加第二个条件表单元素时,您需要使用的语法更改为 setValue...
我需要像这样修改它:
this.modalFG.setValue({'comment': data.comment});
this.modalFG.setValue({'jobStatus': 0});
至:
this.modalFG.controls['jobStatus'].setValue(0);
this.modalFG.controls['comment'].setValue(data.comment);
因为我现在在表单上有两个字段...
然后一切就绪,关于未提供表单字段的误导性信息消失了。
我讨厌这里 Angular 的语法,当你从 1 到 n 值时改变它的功能行为!
我的问题是我没有提供所有表单控件值。例如:
<div formGroupName="form">
<input formControlName="first">
<input formControlName="second">
</div>
在这种情况下,如果您尝试使用方法 setValue
并且不提供所有控件值,如下所示:
this.form.setValue({ second: "" });
它会抛出一个错误。
解决方案
要么使用 setValue
并为所有表单控件提供值:
this.form.setValue({ first: "", second: "" });
或者,如果您确实打算设置部分值,请使用 patchValue
方法:
this.form.patchValue({ second: "" });
您也可以使用 patchValue 单独设置一个或多个输入:
this.form.patchValue({ first: "whatever" });
如果您只需要在表单组中设置一个 ctrl 值,您应该使用
this.formGroup.patchValue({})
,
如果您必须在您应该使用的表单组中设置所有 ctrl 值
this.formGroup.setValue({})
,
“必须提供”告诉您将值传递给表单上的对象。例如:
想象一下这个场景:
public form = this.fb.group({
production: this.fb.group({
name: [''],
id: [''],
screenName: [''],
})
});
当您从服务器收到此数据时,表单等待 3 个对象...“name”、“id”和“screenName”。 PatchValue 工作正常。
但是,如果你收到数据,你只有 2 个对象:“名称”和“屏幕名称”,你尝试这样做:
const formProduction = this.form.get('production');
formProduction.patchValue(this.yourData);
您可能会收到有关“必须申请”的消息,因为表格等待所有数据。发生这种情况,如果你强制执行 Cast,如下所示:
const formProduction = this.form.get('production');
formProduction.patchValue(this.yourData as YourObject);
在讨论顶部的这种情况下,private jobStatus:number 会导致相同的错误。
一个简单的修复方法是将其转换为未知:如果您的服务器不发送所有信息,angular 仅将收到的信息放入表单中,并忽略其他字段。
const formProduction = this.form.get('production');
formProduction.patchValue(this.yourData as unknown);
;-)