2017-07-19 76 views
2

我有一个数组在我的后端调用媒体,存储几个对象。它看起来是这样的:动态formGroup内formArray使用formBuilder角2

"media": [ 
    { 
     "srcId": null; 
     "primary": false, 
     "thumbs": { 
      "default": null 
     }, 
     "type": null, 
     "raw": null 
    } 
] 

我的编辑component.ts用于装载该数组的形式看起来是这样的:

media: this._fb.array([ 
    this._fb.group({ 
     srcId: new FormControl(this.existingMedia.srcId), 
     type: new FormControl(this.existingMedia.type), 
     raw: new FormControl(this.existingMedia.raw), 
     primary: new FormControl(this.existingMedia.primary), 
     thumbs: this._fb.group({ 
     default: new FormControl(this.existingMedia.thumb.default) 
     }) 
    }) 
    ]), 

眼下这会从媒体数组加载的第一个对象但不包括可能在阵列中的其他媒体对象。 有没有办法让formArray Media内的formBuilder组动态变为后端Media Array中的对象数量?

任何帮助/提示/建议将不胜感激!

更新

在我ngOnInit我:

this.currentCard = selectedCurrentCard; 
    for (let medias of this.currentCard.media){ 
    this.existingMedia = medias; 

遍历我的媒体阵列上的后端和

const control = <FormArray>this.cardForm.controls['media']; 
    control.push(this.initCurerntMedia()); 

与initCurrentMedia()看起来像这样: UPDATED initCurrentMedia()此更新版本w在ngOnInit()中调用时得到感谢感谢@ AJT_82的帮助

initCurrentMedia() { 
    this.currentCard.media.forEach(media => { 
     const control = <FormArray>this.cardForm.controls['media']; 
     control.push(
     this._fb.group({ 
      srcId: new FormControl(media.srcId), 
      type: new FormControl(media.type), 
      raw: new FormControl(media.raw), 
      primary: new FormControl(media.primary), 
      thumbs: this._fb.group({ 
      default: new FormControl() 
      }) 
     }) 
    ) 
    }) 
    } 

用当前媒体填充我的表单。它仍然只是填充一个对象。

回答

1

我来样订做形式

this.myForm = this._fb.group({ 
    media: this._fb.array([]) 
}) 

,然后响应后已提取设定值,所以得到响应后,你可以调用一个方法,让我们说setForm()

setForm() { 
    this.media.forEach(x => { 
    this.myForm.controls.media.push(
     this._fb.group({ 
     srcId: x.srcId, 
     type: x.type, 
     raw: x.raw, 
     primary: x.primary, 
     thumbs: this._fb.group({ 
      default: x.thumbs.default 
     })   
    ) 
    }) 
    }) 
} 
+0

我在遵循你的逻辑@ AJT_82,但是我得到了一个type属性的错误,该属性在AbstractControl类型中不存在。 –

+0

well' this.media'应指向响应而不是formarray。似乎你现在正在尝试迭代formarray?双重命名确实有点令人困惑,你应该重新命名:) – Alex

+0

你是对的。我得到了这个工作。我不得不添加const控件= this.myForm.controls ['media']; control.push(在此之后,它正在工作。谢谢@ AJT_82 !!! –