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

Angular动态创建mat-form-field选中值互相覆盖如何实现独立控制

解决方案

问题根因

你当前所有动态生成的<mat-select>都绑定了全局唯一的days FormControl实例,任意一个下拉的选中值修改都会同步到所有绑定该控件的元素,因此会出现选中值互相覆盖的问题。

代码修改

1. TS 代码调整

改用FormArray存储每个条目对应的独立FormControl,每次新增条目时创建新的FormControl实例,默认值设为当天星期:

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

// 修正原数组拼写错误Thuesday→Tuesday
daysList: string[] = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
// 用FormArray存储每个条目的独立FormControl
timesFormArray: FormArray = new FormArray([]);

openExecutionTimeScheduler() {
  const now = new Date();
  const weekday = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
  const todayWeekDay = weekday[now.getDay()];
  // 每次新增创建独立FormControl,默认选中当天
  this.timesFormArray.push(new FormControl([todayWeekDay]));
  // 如果需要同步原有times数组,可同时执行以下操作
  // this.times.push({});
}

如果需要获取所有条目的选中值,直接读取this.timesFormArray.value即可,返回值是和条目顺序对应的选中值数组。如果要删除指定索引的条目,调用this.timesFormArray.removeAt(index)即可。

2. HTML 代码调整

将每个<mat-select>绑定到FormArray对应索引的独立FormControl:

<!-- 若保留原times数组遍历写法,绑定改为[formControl]="timesFormArray.at(i)"即可 -->
<div style="display:flex; flex-direction:row" class="m-portlet__body" *ngFor="let control of timesFormArray.controls; let i = index;">
  <mat-form-field appearance="outline">
    <mat-label>Days Of Week</mat-label>
    <mat-select [formControl]="control" multiple>
      <mat-option *ngFor="let day of daysList" [value]="day">{{day}}</mat-option>
    </mat-select>
  </mat-form-field>
</div>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:18:03