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

Angular 14表单reset()测试环境报错,开发环境正常

Angular 14 FormGroup.reset()测试环境报错:无法赋值给只读属性'_pendingValue'

问题详情

我用Angular 14开发了一个表格筛选表单,本地开发环境中调用表单的reset()方法一切正常,但部署到测试环境后执行该方法时出现错误。

错误信息

ERROR TypeError: Cannot assign to read only property '_pendingValue' of object '[object Object]'
    at FormControl._applyFormState (main.ec267cc59c801252.js:123875:39)
    at FormControl.reset (main.ec267cc59c801252.js:123797:10)
    at main.ec267cc59c801252.js:122817:15
    at main.ec267cc59c801252.js:122864:18
    at Array.forEach (<anonymous>)
    at FormGroup._forEachChild (main.ec267cc59c801252.js:122859:32)
    at FormGroup.reset (main.ec267cc59c801252.js:122816:10)
    at AmlNewGenCasesComponent.initFilterForm (807.bc72eefe3ce58b53.js:601:40)
    at AmlNewGenCasesComponent.onFilterClear (807.bc72eefe3ce58b53.js:722:18)
    at AmlNewGenCasesComponent_ng_template_79_Template_p_button_click_2_listener (template.html:103:38)

相关代码

onFilterClear() {
    if (FormsHelper.isAnyFieldPopulated(this.newGenCasesFilterForm)) {
      this.newGenCasesFilterForm.reset();
      this.initFilterForm();
      this.store.dispatch(getNewGen({gridFilter: this.newGenCasesFilter}));
    } else {
      this.messageService.add({severity: 'info', summary: 'ფილტრი', detail: 'ფილტრი ცარიელია'})
    }
  }

我曾尝试把this.newGenCasesFilterForm.reset();替换成this.newGenCasesFilterForm.resetForm();,但出现TS编译错误:TS2339: Property 'resetForm' does not exist on type 'FormGroup '.


解决办法

1. 移除多余的reset()调用,直接重新初始化表单

你的代码里调用reset()后立刻执行initFilterForm()重建表单,这两步其实重复了。直接重新初始化表单就能达到清空筛选条件的效果,还能规避生产环境下表单对象被冻结的问题。修改后的代码:

onFilterClear() {
    if (FormsHelper.isAnyFieldPopulated(this.newGenCasesFilterForm)) {
      // 直接调用初始化方法替代reset()
      this.initFilterForm();
      this.store.dispatch(getNewGen({gridFilter: this.newGenCasesFilter}));
    } else {
      this.messageService.add({severity: 'info', summary: '过滤器', detail: '过滤器为空'})
    }
  }

2. 检查表单是否被意外冻结

如果你的项目使用了状态管理库(比如NgRx)或者手动调用了Object.freeze(),可能导致FormGroup/FormControl实例被冻结,无法修改内部属性。检查initFilterForm()方法,确保创建表单时没有冻结实例,或者每次重置时生成新的FormGroup实例。

3. 升级Angular 14到最新补丁版本

Angular 14的早期版本在生产模式处理表单reset时存在已知bug,升级到14.2.x系列的最新补丁版本,大概率能解决这类底层的表单操作问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 09:57:55