财产'控制'在类型' AbstractControl'上不存在Angular 4

时间:2017-10-25 07:13:43

标签: angular typescript angular2-forms angular4-forms

我在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);
}

7 个答案:

答案 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
}