迭代 Angular 2+ FormArray

Posted

技术标签:

【中文标题】迭代 Angular 2+ FormArray【英文标题】:Iterate Angular 2+ FormArray 【发布时间】:2018-08-29 21:59:03 【问题描述】:

我有一个 FormArray,需要遍历它的每个成员。

我看到the docs 中有一个get 方法,但我看不到从哪里获取密钥,甚至看不到长度。

如何迭代 FormArray?

【问题讨论】:

【参考方案1】:

您在FormArray 中有一个属性controls,它是AbstractControl 对象的数组。查看FormArray 的具体文档,您会看到它们也继承自AbstractControl,就像您发布的FormControl

请注意,在控件数组中,除了 FormControl 对象之外,您还可以在 FormArrayFormGroup 对象中添加对象,因为可以有嵌套的组或数组。

这是一个简单的例子:

for (let control of formArray.controls) 
   if (control instanceof FormControl) 
      // is a FormControl
   
   if (control instanceof FormGroup) 
      // is a FormGroup  
   
   if (control instanceof FormArray) 
      // is a FormArray
   

【讨论】:

其实我不久前就想通了。感谢您提供更多信息。 不知道为什么没有记录。 This SO answer 帮助了我:this.form = this.fb.group( userIds: this.fb.array([]) ); const userIds = this.form.controls.userIds as FormArray; userIds.value.forEach(key => this.clinet.updateContactGroup(key, this.groupId).subscribe(); ); 你可以遍历formArray.controls,请看下面的答案【参考方案2】:

我通过循环formArray.controls 解决了这个问题:

  formArray.controls.forEach((element, index) => 
    ...
  );

【讨论】:

【参考方案3】:

如果有人需要帮助在模板中迭代它们(就像我做的那样),你可以这样做。

在这种情况下,我们有 FormArray,其中每个孩子都是 FormControl

get myRows(): FormControl[] 
    return (this.<your form group>.get('<field name>') as FormArray).controls as FormControl[];
  

在模板中

*ngFor="let row of myRows"

【讨论】:

以上是关于迭代 Angular 2+ FormArray的主要内容,如果未能解决你的问题,请参考以下文章

Angular 2:迭代反应式表单控件

当我尝试迭代 ngFor 循环时,Angular 2+ attr.disabled 不适用于 div

TypeScript:无法逐行迭代上载的文件(Angular 9)

Angular - 在每次 forEach 迭代后插入值

迭代Angular中的对象[重复]

如何解决 Angular “10 $digest() 迭代次数达到”错误