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

Angular响应式表单报错:_updateTreeValidity与form.get不是函数

Angular响应式表单报错:_updateTreeValidity和get不是函数的解决方法

错误根源

你的代码存在两处关键错误,直接导致表单核心方法丢失:

  1. 覆盖FormGroup实例:在subscribeToRedux方法中,你用普通JS对象{...this.checkoutData}直接赋值给原本是FormGroup实例的checkoutForm,导致checkoutForm变成普通对象,失去了FormGroup特有的_updateTreeValidity、get等方法,Angular表单指令调用这些方法时自然报错。
  2. 错误获取表单数据:在placeOrder方法中,直接展开FormGroup实例{...this.checkoutForm}赋值给checkoutData,会把FormGroup的内部属性一并带入,而非获取表单的实际输入值。

修复代码

1. 修正Redux订阅中的表单赋值逻辑

把直接覆盖FormGroup的代码替换为FormGroup的patchValue方法,用官方API更新表单数据:

private subscribeToRedux = () => {
  // ...其他代码保持不变

  const checkoutReducers$ = this.store.select((state) => {
    return state.checkoutReducers;
  });

  checkoutReducers$.subscribe((checkoutReducers:any) => {
    if(Object.keys(checkoutReducers?.checkoutData).length > 0) {
      this.checkoutData = JSON.parse(JSON.stringify(checkoutReducers.checkoutData));
      
      // 用patchValue更新表单,而非直接覆盖实例
      this.checkoutForm.patchValue(this.checkoutData);

      console.log('ChecoutComponent.checkoutForm 2', this.checkoutForm);
    }

    // ...其他代码保持不变
  });
}

2. 修正placeOrder中的数据获取逻辑

通过FormGroup.value获取表单实际输入值,而非直接展开FormGroup实例:

public placeOrder = () => {    
  // ...其他代码保持不变

  this.checkoutData = {...this.checkoutForm.value};
  this.checkoutData.items = items;
  console.log('CheckoutComponent.checkoutData 2', this.checkoutData);
  this.checkoutService.placeOrder(this.checkoutData);
}

3. 修复saveToDataStore方法的逻辑错误

当前方法传递的是this.checkoutData,但应该传递表单的最新输入值,修改为:

public saveToDataStore = () => {
  this.store.dispatch(storeCheckoutData({checkoutData: this.checkoutForm.value}));
}

补充说明

  • patchValue:支持部分更新表单字段,适合仅更新部分数据的场景;
  • setValue:要求传递完整的表单结构,适合全量更新的场景;
  • 始终通过FormGroup.value获取表单的实际数据,不要直接操作FormGroup实例本身。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 11:23:08