以下是组件的代码,该组件尝试在显示验证错误之前确定AbstractControl中的每个FormGroup是否为pristine:

export class FieldErrorsComponent {
  @Input() control: AbstractControl | FormGroup;

  public controlsAreNotPristine(): boolean {
    if (this.control instanceof FormGroup) {
      return ((this.control as FormGroup).controls.every(control => !control.pristine));
    }
  }
}


当然,这不起作用,因为FromGroup.controls定义如下:
controls: { [key: string]: AbstractControl; };
我不知道在controls上循环的好替代方法是什么?真正的问题是FormGroup.pristine不能真正反射(reflect)其子控件总和的值,我知道这可能是设计使然。

最佳答案

FormGroup不提供任何迭代器作为can be seen from its interface。但是它提供对如下定义的控件的访问:

controls: {[key: string]: AbstractControl}

因此,您可以使用标准的for in循环对其进行迭代:
  public controlsAreNotPristine(): boolean {
    if (this.control instanceof FormGroup) {
      const controls = (this.control as FormGroup).controls
      for (const name in controls) {
         if (controls[name].pristine) {
            return true;
         }
      }
       return false;
    }
  }



FormGroup应该正确反射(reflect)其子控件的状态。从FormGroup上的_updatePristine方法可以看出:
  _updatePristine(opts: {onlySelf?: boolean} = {}): void {
    this._pristine = !this._anyControlsDirty(); <------- ensure all controls are pristine

    if (this._parent && !opts.onlySelf) {
      this._parent._updatePristine(opts);
    }
  }

关于javascript - 在Angular的FormGroup中的子AbstractControl列表上循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45209841/

10-10 01:58