我们如何使用带有可自定义控件的 ngFor formArrays?

Posted

技术标签:

【中文标题】我们如何使用带有可自定义控件的 ngFor formArrays?【英文标题】:How do we use ngFor formArrays with customisable controls within? 【发布时间】:2019-12-13 14:13:15 【问题描述】:

问题摘要:我们的应用程序要求用户可以“添加产品”,从而生成新字段。 html:

   <div formArrayName="products">
     <label>Products *:</label>
     <div *ngFor="let product of products.controls; index as i;">
       <div [formGroupName]="i">
         <div class="form-group row">
<!--...-->

.ts:

  createProduct(): FormGroup 
    return this.formBuilder.group(
      product: [null, Validators.required], // selector (product)
      contractMonth: [null, Validators.required], // selector (months)
      contractYear: [null, Validators.required], // selector (years)
      comment: [null] // text
    );
  

但是,由于最近推出了新的产品类型,不同的产品类型有不同的字段类型。

首先,用户从 productList 选择器中选择一个产品。 根据选择的产品类型,我们仅显示相关字段。例如,对于蔬菜,我们可能会要求选择 vegey-ness,而对于水果,我们可能会要求选择fruity-ness。

我们如何做这种动态formGroup控件的形式?如果没有大量的 ngIfs 和冗余控件,是否有可能?我们之前也遇到过验证器和 ngIf 的问题。

我们不确定最终的 html 是否应该是这样的:

<ng-container *ngIf='Type1'>
<!--Type 1 controls->
<!--...-->
<ng-container *ngIf='Type2'>
<!--...-->

或者 createProduct() 函数发生变化:

  createProduct(): FormGroup 
    return this.formBuilder.group(
      if (productName === 'Type1')
       product: [null, Validators.required], // selector (product)
       contractMonth: [null, Validators.required], // selector (months)
       contractYear: [null, Validators.required], // selector (years)
       comment: [null] // text
      
      // or switch statement and onwards
    ,
// ...
    );
  

以前,我们(绿色开发人员)在 2 种产品类型可用时进行硬编码。但现在这种情况很快就会失控。我们希望我们的编码更干净,而不是像意大利面那样。我们目前将冗余字段作为空值发送。 (而不是仅仅没有这些字段)。

如果这个问题没有很好地说明,我深表歉意。我会按需编辑!

使用大量 *ngIfs。但是我的同事已经被淹没和困惑了。他在验证者方面也有麻烦。 setValidators、Validators.required 和 updateValueAndValidity() 等等。

<!--Example of contract selector, of which there can be many, depending on how many times the user clicks the add product button-->
<ng-select [virtualScroll]="true" [items]="productList" bindLabel="productName" [searchFn]="customSearch" formControlName="product">
                  <ng-template ng-option-tmp let-item="item">
                     item.productName  <br />
                    <small>Exchange:  item.exchange </small> <br />
                    <small>Contract Code:  item.contractCode  
                     </small>
                  </ng-template>
                </ng-select>
<!--...-->

感谢您的阅读!

【问题讨论】:

【参考方案1】:

我找到了我要找的东西! How to use *ngIf else? 和 NgSwitch 等(关于如何在 NgFor 中嵌套 NgSwitch 也有各种答案!)

谢谢!如果有任何问题,我会更新我的页面。

【讨论】:

以上是关于我们如何使用带有可自定义控件的 ngFor formArrays?的主要内容,如果未能解决你的问题,请参考以下文章

使用字符串插值将控件从FormGroup绑定到* ngFor内的模板

DevExpress Winform 通用控件打印方法(允许可自定义边距)

Angular2:输入控制带有ngFor的表单标签内的损失值

DevExpress Winform 通用控件打印方法(允许可自定义边距) z

Android自定义控件实现带百分比显示进度条,可自定义颜色

选择表单控件在 Angular 7 中返回 [object Object]