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

时间:2017-02-14 20:01:29

标签: angular

我想markAsDirty FormGroup内的所有控件{。}}

10 个答案:

答案 0 :(得分:113)

发现Object.keys可以解决这个问题。

Object.keys(this.form.controls).forEach(key => {
  this.form.get(key).markAsDirty();
});

答案 1 :(得分:33)

对于它的价值,还有另一种方法可以做到这一点而无需使用 Object.keys(...)魔术:

for (const field in this.form.controls) { // 'field' is a string

   const control = this.form.get(field); // 'control' is a FormControl

}

答案 2 :(得分:25)

可接受的答案对于平面结构是正确的,但不能完全回答原始问题。网页可能需要嵌套的FormGroups和FormArrays,我们必须考虑到这一点才能创建可靠的解决方案。

public markControlsDirty(group: FormGroup | FormArray): void {
    Object.keys(group.controls).forEach((key: string) => {
        const abstractControl = group.controls[key];

        if (abstractControl instanceof FormGroup || abstractControl instanceof FormArray) {
            this.markControlsDirty(abstractControl);
        } else {
            abstractControl.markAsDirty();
        }
    });
}

答案 3 :(得分:6)



[FromBody] bool boolVariable




答案 4 :(得分:4)

使用@Marcos答案我创建了一个函数,可以调用formGroup作为参数,它将每个formGroup子控件标记为脏,只是为了使它可以从代码中的更多位置使用,例如将它放在服务中。

public touchAllFormFields(formGroup: FormGroup): void {
    Object.keys(formGroup.controls).forEach((key) => {
        formGroup.get(key).markAsDirty();
    });
}

希望它有所帮助;)

答案 5 :(得分:1)

似乎get函数无法再用于在Angular 8中检索表单中的特定值。因此,这就是我解决的方法,并且由于答案有些陈旧,我认为这可以帮助更多的用户。基于@Liviu Ilea的答案

for (const field in this.myForm.controls) { // 'field' is a string
  console.log(this.myForm.controls[field].value);
}

答案 6 :(得分:1)

这是对我有用的

  private markFormGroupTouched(formGroup: FormGroup) {
      Object.keys(formGroup.controls).forEach((key) => {
      const control = formGroup.controls[key];
      control.markAsDirty();
      if ((control instanceof FormGroup)) {
        this.markFormGroupTouched(control);
      }
 });

}

答案 7 :(得分:0)

我创建此函数以使其* 我有一个名为“ order”的控件,并将索引传递给他。

{"conditionGroups": [
   {
     "order": null,
     "conditions": []
   }
  ]
}


updateFormData() {
    const control = <FormArray>this.form.controls['conditionGroups'];  
    control.value.map((x,index)=>{
    x.order = index; 
 })

答案 8 :(得分:0)

基于@Keenan Diggs answer,我编写了一个通用函数来遍历平面或嵌套表单,该函数接受针对每个表单控件执行的操作:

this.BackColor = Color.FromArgb(0, 0, 0); // this is black

要像这样使用:

export function traverseForm(
    form: FormGroup | FormArray, 
    fn: ((c: AbstractControl, name: string, path: string) => void),
    initialPath: string = '') {
  Object.keys(form.controls).forEach((key: string) => {
    const abstractControl = form.controls[key];
    const path = initialPath ? (initialPath + '.' + key) : key;
    fn(abstractControl, key, path);
    if (abstractControl instanceof FormGroup || abstractControl instanceof FormArray) {
        traverseForm(abstractControl, fn, path);
    }
  });
} 

答案 9 :(得分:0)

这是我对您的问题的解决方案,我正在使用带有索引的 for 循环,希望对您有所帮助。

    for (const key of Object.keys(this.forms.controls)) {
      this.forms.controls[key].markAsDirty();
    }