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

Mar*_*hel 73 angular

我想要markAsDirty一个内部的所有控件FormGroup.

Mar*_*hel 148

发现Object.keys可以处理这个..

    Object.keys(this.form.controls).forEach(key => {
      this.form.get(key).markAsDirty();
    });
Run Code Online (Sandbox Code Playgroud)

  • 感谢您阅读我的帖子并更新您自己的答案。官方文档也已经过时,所以我不得不通过打印每一行来解决这个问题。 (3认同)
  • 当我在onSubmit中使用此函数时,出现错误`无法调用类型缺少调用签名的表达式。类型'AbstractControl'没有兼容的呼叫签名。`有人知道为什么吗? (2认同)

Liv*_*lea 41

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

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

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

}
Run Code Online (Sandbox Code Playgroud)

  • 对于那些使用 TSLint 的人,代码有效,但 TSLint 抱怨“for (... in ...) 语句必须用 if 语句 (forin) 过滤”。 (2认同)
  • tslint 指出,引用来自 for...in 语句的 JavaScript 文档 /sf/ask/2853929781/ -过滤器/45959874#45959874 (2认同)

Kee*_*ggs 32

对于平面结构,接受的答案是正确的,但并不能完全回答原始问题.网页可能需要嵌套的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();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)


Mic*_*elo 8

似乎该get 函数不再用于在 Angular 8 中检索表单中的特定值,所以这就是我根据@Liviu Ilea 的答案解决它的方法。

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


Foa*_*oad 5

    Object.keys( this.registerForm.controls).forEach(key => {
       this.registerForm.controls[key].markAsDirty();
    });
Run Code Online (Sandbox Code Playgroud)


Hug*_*ugo 5

使用@Marcos答案,我创建了一个函数,可以调用该函数,将formGroup作为参数传递,并将每个formGroup子控件标记为脏,例如,使其在代码周围的更多位置可用,例如将其放入服务中。

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

希望能帮助到你 ;)


小智 5

这就是对我有用的

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