Angular响应式表单报错:_updateTreeValidity与form.get不是函数
Angular响应式表单报错:_updateTreeValidity和get不是函数的解决方法
错误根源
你的代码存在两处关键错误,直接导致表单核心方法丢失:
- 覆盖FormGroup实例:在
subscribeToRedux方法中,你用普通JS对象{...this.checkoutData}直接赋值给原本是FormGroup实例的checkoutForm,导致checkoutForm变成普通对象,失去了FormGroup特有的_updateTreeValidity、get等方法,Angular表单指令调用这些方法时自然报错。 - 错误获取表单数据:在
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
相关产品推荐
相关产品推荐

