Angular基类FormGroup调用patchValue后子类FormControl值未同步问题
问题产生原因
核心错误是getFormModel()方法的实现存在引用不一致问题:该方法每次被调用时,都会执行new FormControl(null)逻辑,生成一套全新的表单控件实例,和FormGroup内部实际持有的控件根本不是同一个对象。
- 基类构造函数初始化
this.form时,第一次调用getFormModel()拿到的控件集合,会被注册为FormGroup的内部控件,后续所有patchValue、setValue操作,修改的都是这组控件的值。 - 后续在测试或业务代码里调用
component.getFormModel().name时,方法会重新创建一套从未被加入FormGroup、从未被更新过的新控件,这些控件的初始值就是null,自然拿不到patchValue设置的新值。 - 尝试的循环
addControl方案也存在相同问题:循环判断条件里调用一次getFormModel()生成一套控件,循环体内取控件时又会重复调用方法生成新的控件实例,最终注册到FormGroup里的控件和后续访问拿到的控件依然不是同一个引用。
修复方案
不要在getFormModel()方法里动态创建控件,而是将表单控件模型初始化为类的固定属性,保证所有场景下拿到的都是同一套控件引用:
@Component({...}) export class SomeComponent extends Base<IModel> { // 仅在类实例化时创建一次控件,持有固定引用 private readonly formControls: FormGroupModel<IModel> = { id: new FormControl(null), name: new FormControl(null) }; getFormModel(): FormGroupModel<IModel> { // 直接返回已创建好的控件对象,不重复生成新实例 return this.formControls; } }
修改后,form.patchValue()更新的控件,和getFormModel()返回的控件是完全相同的实例,通过两种路径访问控件值都能拿到最新结果,单元测试可正常通过。
内容的提问来源于stack exchange,提问作者Mikelgo
相关产品推荐
相关产品推荐

