我在Angular 4中尝试嵌套的反应形式。它运行正常但是当我尝试构建AOT时它会抛出错误
我用谷歌搜索并尝试了一些东西,但没有运气。谁能告诉我如何解决这个问题?'控制'类型' AbstractControl'
上不存在
<div [formGroup]="myForm">
<div formArrayName="addresses">
<div *ngFor="let address of myForm.get('addresses').controls; let i=index"
class="panel panel-default">
<span *ngIf="myForm.get('addresses').length > 1"
(click)="removeAddress(i)">Remove</span>
<div [formGroupName]="i">
<mat-form-field>
<input matInput formControlName="city" placeholder="city" value="">
</mat-form-field>
</div>
</div>
</div>
<a (click)="addAddress()" style="cursor: default"> Add +</a>
</div>
下面的打字稿代码
constructor(private _fb: FormBuilder) {
}
ngOnInit() {
this.myForm = this._fb.group({
addresses: this._fb.array([
this.initAddress(),
])
});
}
initAddress() {
return this._fb.group({
city: ['']
});
}
addAddress() {
const control = <FormArray>this.myForm.get('addresses');
control.push(this.initAddress());
}
removeAddress(i: number) {
const control = <FormArray>this.myForm.get('addresses');
control.removeAt(i);
}
答案 0 :(得分:44)
基于@GünterZöchbauer评论,首先我改变了
html和typescript 中的 myForm.controls['addresses']
到myForm.get('addresses')
然后基于@yuruzi评论
将myForm.get('addresses').controls
更改为myForm.get('addresses')['controls']
现在工作正常。谢谢@gunter&amp; yuruzi
答案 1 :(得分:5)
不过,您可以轻松修复它。将“获取控件”逻辑外包到组件代码(.ts
文件)的方法中:
`getControls() {
return (<FormArray>this.recipeForm.get('controlName')).controls;
}`
然后,您可以在模板中使用:
*ngFor="let ingredientCtrl of getControls(); let i = index"
由于TS的工作方式和Angular解析您的模板(那里不了解TS),因此需要进行此调整。
答案 2 :(得分:0)
获取FormArray
的长度,只需使用length
:
<span *ngIf="myForm.controls['addresses'].length > 1" (click)="removeAddress(i)">Remove</span>
希望有所帮助
答案 3 :(得分:0)
将myForm.get('addresses').controls
更改为myForm.get('addresses').value
也可以解决此问题。
答案 4 :(得分:0)
使用验证错误...
<span *ngIf="f.YOUR_FORM_KEY.controls.YOUR_FORM_KEY.errors?.YOUR_FORM_VALIDATION">YOUR_FORM_KEY is YOUR_FORM_VALIDATION</span>
例如
<span *ngIf="f.name.controls.name.errors?.required">Name is required</span>
ts文件
get f(): any {
return this.userForm.controls;
}
答案 5 :(得分:0)
作为@sunny kashyap解决方案的更新,我会这样写:
getControls() {
return (this.recipeForm.get('controlName') as FormArray).controls;
}
答案 6 :(得分:0)
可以使用自定义界面
// Define AbstractFormGroup
export interface AbstractFormGroup extends FormGroup {
controls: {
[key: string]: AbstractFormGroup & AbstractFormGroup[] & AbstractControl & FormGroup & FormArray,
}
}
// Usage example
class ... {
myForm: AbstractFormGroup
...
this.myForm = this.fb.group({...}) as AbstractFormGroup
}