如何为 angular 10 中的重复字段集构造或构建表单?

How to structure or build form for the repetitive set of fields in angular 10?

<div class="card">
  <div>
    <span>Level </span>
  </div>
  <ul>
    <li>
      <div *ngFor="let sensorType of sensorsEnum">
        <mat-form-field class="col-12">
          <mat-label>Select {{ sensorType.name }}</mat-label>
          <mat-select formControlName="?">
            <mat-form-field appearance="outline" class="w-100">
              <input matInput #sensorTemperatureFilter />
            </mat-form-field>
            <mat-option *ngFor="
                      let sensor of sensors
                        | filter: sensorTemperatureFilter.value
                    " [value]="sensor.id">
              {{ sensor.id }}
            </mat-option>
          </mat-select>
        </mat-form-field>
      </div>
    </li>
  </ul>
</div>


export enum SensorsEnum {
  Temperature = "temperature",
  Humidity = "humidity",
  PH = "ph",
  EC = "ec",
  N = "N",
  P = "P",
  K = "K",
}

我正在使用上面的枚举来循环。上面的 html 片段产生一个级别。我需要并排放置 3 个级别。

级别代表土壤的深度,对于每个级别,应选择不同的传感器。有 30、15、10、5 四个级别。每个级别都有相同的字段集。现在我想在单击创建时一次性验证所有这些级别。如何构建 formGroup?提前致谢

Here this is a box with horizontal scroll with four different levels.

您可以创建一个方法,returns 一个包含匹配字段集的表单组。然后您可以定义一个包含通过此方法构建的四个子组的父组。

注意:我使用的是在构造函数中作为 private fb:FormBuilder 导入的表单生成器。

public parentGroup = this.fb.group({
  level30: this.createGroup(data.level30),
  level15: this.createGroup(data.level15),
  level10: this.createGroup(data.level10),
  level5: this.createGroup(data.level5)
});

public createGroup = (data) => this.fb.group({
  tempurature: this.fb.control(data.tempurature.value),
  humidity: this.fb.control(data.humidity.value),
  ph: this.fb.control(data.ph.value),
  N: this.fb.control(data.N.value),
  P: this.fb.control(data.P.value),
  K: this.fb.control(data.K.value)
});

我在猜测您的数据结构方面有很大的自由度。无论如何,您现在将父表单组名称放在包装 DOM 中,并对所有子控件使用 formGroupNameformControlName

只要DOM控制结构匹配上面的表单组结构,就可以get/validate整个表单的数据使用:

console.log(this.parentGroup.value);
/*
{
  level30: {
    tempurature: 15,
    humidity: 30,
    ph: 6.5,
    //...
  },
  level15: {
    //...
  },
  level10: {
    //...
  },
  level5: {
    //...
  }
}
*/