Angular 5从JSON结果构建表单数组

时间:2018-10-22 14:43:31

标签: arrays json angular formarray angular-formbuilder

我在Angular表单数组中遇到以下问题,我想知道是否有人可以帮助我,因为我对Angular很陌生?

抱歉,由于项目的复杂性(大量的依赖关系和复杂的代码),我无法提供帮助,但我会尽我所能提供尽可能多的细节!

我从服务调用获得JSON响应,该服务调用包含一组字段(称为“ myFields”),例如:

0:
name: "field1"
1:
name: "field2"

我从对API的调用中获得了此响应,因此我需要使用响应中的字段来构建表单。我目前正在遍历此响应,并尝试构建如下的表单数组:

constructor(private formBuilder: FormBuilder){

    this.myFormGroup = this.formBuilder.group({
        aliases: this.formBuilder.array([
        ])
    });

}

get aliases() {
    return this.myFormGroup.get('aliases') as FormArray;
}

getServiceFields(){

    *call to get fields and store in "myFields"*
    for (let item of myFields) {
        this.aliases.push(this.createGroup(item));
    }
}

createGroup(item): FormGroup {
    return this.formBuilder.group({
        name: new FormControl(item.name)
    });
}

在我看来,我有:

<div [formGroup]="myFormGroup" class="example-form">
    <div formArrayName="aliases" >
    <div *ngFor="let field of myFormGroup.controls.aliases.controls; 
    let i=index">

        <mat-form-field>
            <input matInput placeholder="{{field.value.name}}"
            formControlName="{{field.value.name"}}>
        </mat-form-field>

我遇到的问题是页面上什么都没有显示,这是我在控制台窗口中看到的错误:

Error: Cannot find control with path: 'aliases -> name'

我还将在控制台窗口中附加一个截图,显示我的FormGroup的结构:

FormGroup structure

希望这是足够的信息,如果需要其他详细信息,我可以提供它们。有人知道我要去哪里了吗?谢谢!

编辑:由于无法循环浏览“别名”中的控件列表,因此无法对formControlName(例如formControlName =“ name”)进行硬编码,这就是为什么我尝试使用{{field.value.name}}的原因

1 个答案:

答案 0 :(得分:1)

  <div *ngFor="let field of myFormGroup.controls.aliases.controls; 
    let i=index">
<div [formGroup]="field">
        <mat-form-field>
            <input matInput placeholder="{{field.value.name}}"
            formControlName="name">
        </mat-form-field>
        </div>

替换上面的html代码。

问题是您没有在formcontrolname之前绑定formgroup。 formcontrolname应该在formgroup下工作。

如果您有任何疑问,请告诉我。