首页 文章

Angular 2使用FormBuilder在FormArrays中访问嵌套的FormArrays

提问于
浏览
0

首先,我刚开始使用Angular 2,我正在尝试构建嵌套表单并验证它并将新对象项目添加到对象GroupProject中 .

这是我的ts文件的一部分:

ngOnInit() {
  this.myForm = this.formBuilder.group({
    groupproject: this.formBuilder.array([
      this.initGroupProjects()
    ])
  });
}

public initGroupProjects(): any {
    return this.formBuilder.group({
        groupproject: this.formBuilder.array([this.initProjects()])
    });
}

public initProjects(): any {
  return this.formBuilder.group({
    name: ['', [Validators.required, Validators.minLength(3)]],
    some_array: this.formBuilder.array([
      this.formBuilder.group({
        name: ['', Validators.required],
        attr: ['', Validators.required],
        some_id: [1, Validators.required]
      })
    ])
  });
}

addProject(): void {
  const control = < FormArray > this.myForm.controls['projects'];
  control.push(this.initProjects());
}

视图:

<form [formGroup]="myForm" novalidate (ngSubmit)="onSubmit(myForm)">
    <div formArrayName="groupproject">
        <div [formGroupName]="gp" *ngFor="let objGroupProject of myForm.controls.groupproject.controls; let gp = index">
            <div formArrayName="projects">
                <div [formGroupName]="i" *ngFor="let project of objGroupProject.controls.projects.controls; let i = index">
                    <md-input placeholder="Name" formControlName="name"></md-input>
                    <div formArrayName="some_array">
                        <div [formGroupName]="x" *ngFor="let some_obj of project.controls.some_array.controls; let x = index">
                            <div>
                                <md-input placeholder="Nome" formControlName="name"></md-input>
                                <small *ngIf="!some_obj.controls.name.valid">Nome é requerido</small>
                            </div>
                            <md-input type="number" placeholder="Cost" formControlName="attr" required></md-input>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <button type="submit" md-raised-button color="primary" [disabled]="!myForm.valid">Submit</button>
</form>
<pre>form value: <br>{{myForm.value | json}}</pre>

表格值的输出:

形式 Value :

{  
   "groupproject":[  
      {  
         "projects":[  
            {  
               "name":"",
               "some_array":[  
                  {  
                     "name":"",
                     "attr":"",
                     "some_id":1
                  }
               ]
            },
            {  
               "name":"",
               "some_array":[  
                  {  
                     "name":"",
                     "attr":"",
                     "some_id":1
                  }
               ]
            }
         ]
      }
   ]
}

好吧,你可以看到我有一些叫做groupprojects的数组,每个数组里面都有一个数组 .

所以问题是我无法在对象groupproject中插入对象项目

其实我收到以下错误:

错误类型错误:无法读取未定义的属性“控件”

1 回答

  • 1

    您很可能在以下代码中有一个类型:

    public initGroupProjects(): any {
        return this.formBuilder.group({
            groupproject: this.formBuilder.array([this.initProjects()])
             ^^^^^^^
        });
    }
    

    我认为它应该是 projects 而不是 groupproject

    public initGroupProjects(): any {
        return this.formBuilder.group({
            projects: this.formBuilder.array([this.initProjects()])
        });
    }
    

    检查还在工作 Plunker Example

    也可以看看

相关问题