angular - 在 formArray 中验证 formGroup 的问题

标签 angular angular-reactive-forms angular-validation

我正在创建一个带有 Angular Material 垫台的表格。

我在编写我的应用程序时使用了响应式表单,表单启动看起来像这样:

myForm = this.fb.group({
    settings: this.fb.array([])
});

我的表单是一个包含 formArray 控件(设置)的 formGroup。

设置 formArray 包含每个设置的 formGroup(mat-table 中的每一行都是一个 formGroup 并包含多个控件)。

当我尝试向它添加验证时,我的问题就开始了。

如果我只有一个带有 formControl 的 formGroup,并且其中之一是 Validators.required,例如,在我添加一些值之前表单是无效的,然后它会变为有效状态。

然而,当在表单数组中使用 formGroup 时,即使在向 require 字段添加了一些值之后,表单状态仍然无效(我什至控制台记录表单以查看内部值是否已更改并且确实如此)。

此外,当我尝试使用 valueChange().subscribe 捕获更改时...只有当我从 formArray 中推送/删除组时才会触发事件,而不会在设置组内的现有控件发生更改时触发。

我如何监听数组内部组中的内部变化事件,然后对它们使用一些自定义估值?

最佳答案

没有看到更多你的代码......很难猜出哪里出了问题。

但这里是我的一些代码供引用:

组件代码

  get addresses(): FormArray {
    return <FormArray>this.customerForm.get('addresses');
  }

  ngOnInit() {
    this.customerForm = this.fb.group({
      firstName: ['', [Validators.required, Validators.minLength(3)]],
      lastName: ['', [Validators.required, Validators.maxLength(50)]],
      addresses: this.fb.array([this.buildAddress()])
    });
  }

  addAddress(): void {
    this.addresses.push(this.buildAddress());
  }

  buildAddress(): FormGroup {
    return this.fb.group({
      addressType: 'home',
      street1: ['', Validators.required],
      street2: '',
      city: '',
      state: '',
      zip: ''
    });
  }

模板

    <div formArrayName="addresses"
         *ngFor="let address of addresses.controls; let i=index">

        <div class="form-group row mb-2">
          <label class="col-md-2 col-form-label"
                 attr.for="{{'street1Id' + i}}">Street Address 1</label>
          <div class="col-md-8">
            <input class="form-control"
                   id="{{'street1Id' + i}}"
                   type="text"
                   placeholder="Street address (required)"
                   formControlName="street1"
                   [ngClass]="{'is-invalid': (address.controls.street1.touched || 
                                              address.controls.street1.dirty) && 
                                              !address.controls.street1.valid }">
            <span class="invalid-feedback">
              <span *ngIf="address.controls.street1.errors?.required">
                Please enter your street address.
              </span>
            </span>
          </div>
        </div>
    </div>

您可以在这里找到完整的项目:https://github.com/DeborahK/Angular-ReactiveForms/tree/master/Demo-Final

关于angular - 在 formArray 中验证 formGroup 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53997655/

相关文章:

angular - 如何在ionic2中使用事件onChange

angular - Ionic 2 在页面打开时向下滚动页面

angular - 为什么不收集 FormControl#valueChanges 的订阅垃圾?

为输入字段选择浏览器建议时,Angular Pipe 不起作用

日期最小值的 Angular 自定义验证器

Typescript - 参数 'u' 隐式具有 'any' 类型

java - 从客户端实现的 Angular 来看,我可以将 Java Callable 与 Angular Observable (RxJS) 进行比较吗

angular - 将自定义组件添加到响应式表单的 FormGroup 的正确方法是什么?

javascript - 使用 AngularJS 验证单选按钮集

Angular 验证消息出现在 reset() 表单之后