You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular中ngFor生成的多select如何提交所有选中值?

问题原因

所有<select>都绑定了同一个formControlName="listItems",每选择一个选项就会覆盖之前的值,最终只保留最后一次选择的结果。

解决方案

1. 调整表单结构

在组件类中,为每个自定义字段(data.listCustomFields里的每一项)创建独立的FormControl,并挂载到listCustomFields这个FormGroup下,用d.fieldId作为控件的唯一标识。

示例组件代码:

import { FormBuilder, FormGroup, FormControl } from '@angular/forms';

// ...

this.yourForm = this.fb.group({
  listCustomFields: this.fb.group({
    // 遍历自定义字段,为每个fieldId创建空控件
    ...this.data.listCustomFields.reduce((controls, d) => {
      controls[d.fieldId] = new FormControl('');
      return controls;
    }, {})
  })
});

2. 修改模板代码

把<select>的formControlName从固定的listItems改成当前字段的fieldId,确保每个下拉框绑定到独立的表单控件:

<ng-container *ngFor="let d of data.listCustomFields;">
  <div class="g-col-12 g-col-md-2">
    <label id="{{ d.name }}" class="col-form-label">{{ d.name }}:</label>
  </div>
  <div class="g-col-12 g-col-md-4" formGroupName="listCustomFields">
    <select id="dropdown-{{ d.fieldId }}" name="{{ d.fieldId }}" class="form-select" formControlName="{{ d.fieldId }}">
      <option disabled selected value>Select</option>
      <option *ngFor="let x of d.listItems" [value]="x">{{x}}</option>
    </select>
  </div>
</ng-container>

最终效果

提交表单后,响应会变成类似这样的结构,包含所有选中的选项值:

{
  "listCustomFields": {
    "fieldId1": "选中值1",
    "fieldId2": "选中值2",
    "fieldId3": "选中值3"
  }
}

内容的提问来源于stack exchange,提问作者fearless924

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:05:15