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

Angular表单中动态新增input字段时如何禁用之前的输入字段

实现方案

我们可以通过Angular响应式表单+可编辑索引标记的方式实现需求,具体逻辑和代码如下:

  • 用FormArray存储所有动态生成的input对应的表单控件,同时声明一个editableIndex变量标记当前允许编辑的字段索引。
  • 点击添加按钮时,先把editableIndex更新为即将新增的字段的位置(也就是当前FormArray的长度),再往FormArray中插入新的表单控件。
  • 模板中遍历FormArray渲染input时,给每个input绑定readonly属性,当遍历索引不等于editableIndex时就启用只读状态。
代码示例

组件逻辑代码(.ts)

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

@Component({
  selector: 'app-dynamic-input-form',
  templateUrl: './dynamic-input-form.component.html'
})
export class DynamicInputFormComponent {
  dynamicForm: FormGroup;
  // 初始值可以根据需求调整,设为0默认第一个字段可编辑,设为-1默认所有字段初始只读
  editableIndex: number = -1;

  constructor(private fb: FormBuilder) {
    this.dynamicForm = this.fb.group({
      inputList: this.fb.array([])
    });
  }

  get inputFormArray(): FormArray {
    return this.dynamicForm.get('inputList') as FormArray;
  }

  addNewInput(): void {
    // 先更新可编辑索引为新增字段的位置
    this.editableIndex = this.inputFormArray.length;
    // 插入新的空表单控件
    this.inputFormArray.push(new FormControl(''));
  }
}

模板代码(.html)

<form [formGroup]="dynamicForm">
  <ng-container formArrayName="inputList">
    <div *ngFor="let control of inputFormArray.controls; let idx = index">
      <input 
        type="text"
        [formControlName]="idx"
        [readonly]="idx !== editableIndex"
      >
    </div>
  </ng-container>
  <!-- 新增按钮,你可以替换为自己的图标组件 -->
  <button type="button" (click)="addNewInput()">➕ 添加字段</button>
</form>
可选扩展
  • 如果后续需要支持修改历史字段,只需要给每个字段加一个编辑按钮,点击时把editableIndex赋值为对应字段的索引即可。
  • 如果需要区分只读和可编辑样式,直接给input[readonly]编写专属CSS即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:09:08