【问题标题】:Angular v6: How to disable particular formControl of formArray based on the selection value?Angular v6:如何根据选择值禁用 formArray 的特定 formControl?
【发布时间】:2021-02-02 23:11:55
【问题描述】:

我检查了许多 Stackblitz 示例以进行 formArray 验证,并根据其他 formControl 值禁用了 formControl,并尝试使用相同的方法,但在我的表单中它没有应用相同的东西。

qty formControl 的验证不起作用,如果用户从选择中选择一个活动值,则应启用 fromControl qty,否则默认情况下应禁用它,这也无法正常工作。

我错过了什么?

这是我的Stackblitz 演示。

我用于验证的参考。 https://stackblitz.com/edit/angular-validate-dynamic-formarray-formbuilder-pru78n?file=app/app.component.ts

HTML 组件

<div formArrayName="dataCollection">
    <div class="row" [formGroupName]="i" *ngFor="let element of data; let first = first; let i = index">
        <div *ngIf="!first">----------</div>
        <div formArrayName="sizes">
            <ng-container [formGroupName]="j" *ngFor="let qtys of data[0].sizes; let j = index">
                <div class="col">
                    <mat-form-field class="">
                            <input matInput type="text" formControlName="qty">
              <!-- <p *ngIf="element['controls'].qty?.errors?.required">Qty is required</p>
              <p *ngIf="element['controls'].qty?.errors?.pattern">Error pattern</p> -->
          </mat-form-field>
          <mat-form-field class="">
            <mat-select placeholder="Status"
              formControlName="statusMethod"
              (selectionChange)="onSelectionChanged($event)">
              <mat-option value="AC">Active</mat-option>
              <mat-option value="IN">Deactive</mat-option>
            </mat-select>
          </mat-form-field>
                </div>
            </ng-container>
        </div>
    </div>
</div>

TS 组件

onSelectionChanged({value}) {
  if (value === 'IN') {
    this.dataForm.get('dataCollection').get('qty').disable();
  } else {
    this.dataForm.get('dataCollection').get('qty').enable();
  }
}

【问题讨论】:

    标签: angular validation angular-reactive-forms


    【解决方案1】:

    在您的 onSelctionChanged() 方法中,没有对所选 FormArray 索引的引用。您必须从模板中传递它们,例如(selectionChanged)="onSelectionChanged(i, j)"。 现在您可以使用索引来访问嵌套 FormArrays 中的数据:

    onSelectionChanged(i, j) {
      const control = (<FormArray>((<FormArray>this.dataForm.get("dataCollection")).at(i).get("sizes"))).at(j);
      if (control.get("statusMethod").value === "IN") {
        control.get("qty").disable();
      } else {
        control.get("qty").enable();
      }
    }
    

    有关访问 FormArray 中数据的更多信息,请参阅documentation 或此entry

    这是您的Stackblitz Demo 的更新版本。

    【讨论】:

    • 在页面加载时它仍然处于活动状态,并且对qty formControl 的验证也不起作用。
    • 'onSelectionChanged()` 方法只有在你改变某些东西时才会生效。如果您想在页面加载时拥有此功能,您需要一个循环,在表单填充数据后,该循环将通过所有 FormArray 元素。在您的情况下是嵌套循环。我不清楚验证的要求。
    • 验证应该是只输入数字,我已将其设置为 formControl 但不会设置为 HTML。
    • 我更新了Stackblitz Demo,使用了一个名为toggleFields()的初始切换方法。我认为验证效果很好。如果输入 3 个数字并保存,则该字段有效……否则无效。如果您只想在 html 端允许数字,那么您必须将 type="number" 的输入字段设为 &lt;input matInput type="number" formControlName="qty"&gt;
    猜你喜欢
    • 1970-01-01
    • 2019-11-02
    • 2019-05-06
    • 1970-01-01
    • 2018-06-23
    • 2019-04-23
    • 2018-12-03
    • 2017-06-09
    • 1970-01-01
    相关资源
    最近更新 更多