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

Angular5:嵌套FormArray的FormControl为何编辑时自动禁用?

最近在开发一个原本以为是基础款的调度器(Scheduler)组件,结果遇到了个头疼的问题,好在已经找到解决方案了,先跟大家说说核心问题和解决办法,另外还有个全选功能的需求暂时搁置,也想问问大家的思路。

核心问题:禁用行启用后编辑又变回禁用

我遇到的问题是:当组件传入处于禁用状态的行后,手动把这行启用并开始编辑时,它居然又自动变回禁用状态了!但如果我在OnInit钩子初始化的时候就把所有行都设为启用,整个功能就完全正常,一点问题都没有。

我的解决方案

排查了半天,发现问题出在表单控件和数据源的状态不同步上。具体来说,初始化时禁用行的状态虽然同步到了FormArray的对应控件,但手动启用行的时候,只改了数据源的属性,没同步更新表单控件的状态。修复步骤如下:

  1. 同步数据源与表单控件的禁用状态
    当切换行的启用/禁用状态时,不仅要修改数据源里的disabled属性,还要调用对应FormControl的enable()或disable()方法:

    toggleRowStatus(index: number) {
      const row = this.schedulerRows[index];
      row.disabled = !row.disabled;
      const control = this.schedulerFormArray.at(index);
      row.disabled ? control.disable() : control.enable();
    }
    
  2. 初始化时正确绑定表单控件状态
    在组件初始化构建FormArray的时候,要根据每行的初始disabled属性,直接设置表单组的禁用状态:

    ngOnInit() {
      this.schedulerFormArray = this.fb.array(
        this.schedulerRows.map(row => 
          this.fb.group({
            // 这里填你的表单字段,比如time: [row.time], task: [row.task]
          }, { disabled: row.disabled })
        )
      );
    }
    

求助:全选功能实现思路(暂时搁置)

目前我还卡在全选功能上,想要实现一键切换所有行的启用/禁用状态,同时还要同步更新所有对应的表单控件状态。如果有朋友做过类似的功能,欢迎分享下你的实现思路呀!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 10:07:25