我想将markAsDirty
所有控件都放在FormGroup
。
我想将markAsDirty
所有控件都放在FormGroup
。
Answers:
发现Object.keys
可以解决这个问题。
Object.keys(this.form.controls).forEach(key => {
this.form.get(key).markAsDirty();
});
对于Angular 8+,请使用以下内容(基于米开朗基罗的答案):
Object.keys(this.form.controls).forEach(key => {
this.form.controls[key].markAsDirty();
});
对于它的价值,还有另一种无需使用Object.keys(...)魔法的方法:
for (const field in this.form.controls) { // 'field' is a string
const control = this.form.get(field); // 'control' is a FormControl
}
接受的答案对于平面结构是正确的,但不能完全回答原始问题。网页可能需要嵌套的FormGroups和FormArrays,我们必须考虑到这一点才能创建可靠的解决方案。
public markControlsDirty(group: FormGroup | FormArray): void {
Object.keys(group.controls).forEach((key: string) => {
const abstractControl = group.controls[key];
if (abstractControl instanceof FormGroup || abstractControl instanceof FormArray) {
this.markControlsDirty(abstractControl);
} else {
abstractControl.markAsDirty();
}
});
}
instanceof
在被Typescript编译后将始终有效吗?
instanceof
并非特定于TypeScript的关键字(developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…)也不是class
数据类型。
使用@Marcos答案,我创建了一个函数,可以调用该函数,将formGroup作为参数传递,并将每个formGroup子控件标记为脏,例如,使其在代码周围的更多位置可用,例如将其放入服务中。
public touchAllFormFields(formGroup: FormGroup): void {
Object.keys(formGroup.controls).forEach((key) => {
formGroup.get(key).markAsDirty();
});
}
希望能帮助到你 ;)
似乎该get
函数不再可用于在Angular 8中检索表单中的特定值,因此这就是我根据@Liviu Ilea的答案解决的方法。
for (const field in this.myForm.controls) { // 'field' is a string
console.log(this.myForm.controls[field].value);
}
我创建此函数是为了使它*我有一个名为“ order”的控件,并将索引传递给他。
{"conditionGroups": [
{
"order": null,
"conditions": []
}
]
}
updateFormData() {
const control = <FormArray>this.form.controls['conditionGroups'];
control.value.map((x,index)=>{
x.order = index;
})
Cannot invoke an expression whose type lacks a call signature. Type 'AbstractControl' has no compatible call signatures.
有人知道为什么吗?