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

Angular响应式表单:正确创建FormArray嵌套FormGroup的方法

解决Angular中FormArray内FormGroup同步变化的问题

问题根源

你循环推入FormArray的是同一个FormGroup实例,所有数组元素共享同一内存引用,因此修改任意一项的表单值,其他项会同步变化。

解决方案

不要复用单个FormGroup实例,每次循环都创建新的FormGroup对象。推荐用工厂方法封装表单创建逻辑,保证每次调用都生成全新实例。


修正后的Component.ts代码

import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, FormArray } from '@angular/forms';

@Component({
  selector: 'app-consumption',
  templateUrl: './consumption.component.html',
  styleUrls: ['./consumption.component.css']
})
export class ConsumptionComponent implements OnInit {
  consumptionPerMonth: FormArray;

  constructor(private fb: FormBuilder) {}

  ngOnInit(): void {
    this.consumptionPerMonth = this.fb.array([]);
    // 循环创建12个独立的FormGroup并推入数组
    for (let i = 0; i < 12; i++) {
      this.consumptionPerMonth.push(this.createConsumptionForm());
    }
  }

  // 表单工厂方法:每次返回全新的FormGroup实例
  private createConsumptionForm(): FormGroup {
    return this.fb.group({
      electricity: [0], // 默认值可按需调整
      water: [0]
    });
  }
}

对应的Component.html代码

<form [formGroup]="consumptionPerMonth">
  <div *ngFor="let consumptionForm of consumptionPerMonth.controls; let i = index" 
       [formGroup]="consumptionForm"
       class="month-item">
    <h4>第{{i+1}}月</h4>
    <label>电量:</label>
    <input type="number" formControlName="electricity">
    <label>水量:</label>
    <input type="number" formControlName="water">
  </div>
</form>

效果说明

修改后,每个月份的表单都是独立的FormGroup实例,内存引用互不关联,修改任意一行的输入值只会影响对应项的表单数据,不会同步到其他行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 21:23:17