typescript - “AbstractControl”类型缺少“FormGroup”类型的以下属性:控件、registerControl、addControl、removeControl 和另外 3 个
问题描述
我们最近从 ng 7.2.15 和 typescript 3.2.4 升级到 angular v8.2.14 和 typescript v3.5.3。将表单组从父组件传递到子组件不再有效。
下面是我的子组件:子组件。ts
@Component({selector:'edit-overview'})
export class ChildComponent implements OnInit {
public OverviewFormGroup : FormGroup
constructor(private controlContainer: ControlContainer) {
}
ngOnInit() {
this.OverviewFormGroup = <FormGroup>this.controlContainer.control;
}
}
child.component.html
<div [formGroup] ='OverviewFormGroup'>
</div>
和我的父组件
Parent.component.html
<div [formGroup]="Form1">
<edit-overview [formGroup] = "Form1.controls.OverviewFormGroup">
</edit-overview>
</div>
父组件.ts
export class ParentComponent {
constructor(private readonly fb: FormBuilder) {
this.Form1 = this.fb.group({
name: new FormControl('', [Validators.required]),
OverviewFormGroup: new FormGroup({
description: new FormControl('', [Validators.nullValidator])
})
})
}
}
它会引发此错误:“AbstractControl”类型缺少“FormGroup”类型的以下属性:控件、registerControl、addControl、removeControl 以及父模板行中的另外 3 个属性。
早先将表单组从父级传递给子级不再是问题。我在这里错过了什么吗?我已经在表单组声明中为控件赋值。
解决方案
好问题,这是一个晦涩难懂的错误。错误来自类型安全功能!因为 Angular 无法从您访问它的方式知道它是一个表单组(它只知道它是一个AbstractFormControl
),所以您需要告诉它!
选项 1:as
用于使类型显式
例如,如果您有:
mainForm: FormGroup = this.formBuilder.group({
name: ['Max'],
address: this.formBuilder.group({
street: ['PayneStreet'],
zip: [50000]
})
});
为了让 Angular 知道你实际上是在访问一个表单控件,你需要告诉它:
get addressForm() {
return this.mainForm.get('address') as FormGroup;
}
重要的部分是as FormGroup
. 像这样 Angular 知道它实际上是一个FormGroup
而不仅仅是一个抽象的表单控件。然后你可以继续在 html 中使用它:
<app-address-form [addressForm]="addressForm"></app-address-form>
在这里找到 stackblitz: https ://stackblitz.com/edit/angular-nested-forms-input
选项 2(首选):单独定义嵌套组
实际上,单独构建第二个表单然后将其附加到主表单更容易且类型更安全:
addressForm = this.formBuilder.group({
street: ["PayneStreet"],
zip: [50000]
});
mainForm: FormGroup = this.formBuilder.group({
name: ["Max"],
address: this.addressForm
});
并在 html 中(同上)
<app-address-form [addressForm]="addressForm"></app-address-form>
像这样,Angular 已经知道它addressForm
是类型FormGroup
而不仅仅是类型AbstractFormControl
Stackblitz:https ://stackblitz.com/edit/angular-nested-forms-input-2
推荐阅读
- html - 没有子表的 `th` 元素的直接表`th` 元素的 CSS 选择器 - 是可能的
- ssl - 允许本地服务器通过 https 使用 websocket
- postgresql - Postgres GROUP BY 一个数组列
- pandas - 关于“列”的“值”的数据透视表总和
- python - _tkinter.TclError:无法调用“框架”命令:应用程序已被销毁
- tizen - genlist的水平滚动
- java - 如何交换字符串数组中的值?
- android - 如何在 Kotlin 中获取执行输出?
- regex - 正则表达式忽略以特定模式结尾的字符串
- javascript - 在 Service Worker 中使用 performance.now() 获取 API 响应时间