使用 patchValue 为模板驱动表单进行初始化

2023-12-02

我使用模板驱动,并尝试使用 patchValue 初始化我的表单,但它不起作用。

如果我使用双向绑定来设置值 [(fooBar)] 甚至 setTimeout,我可以让它工作,但我只是想知道,有没有办法让它只与 patchValue 一起工作?

https://stackblitz.com/edit/angular-fft2c5

谢谢。


它不起作用,因为打电话时 patchValue 方法,您的表单中尚未注册任何控件.

Why?

那是因为模板驱动的表单是 异步。他们将表单控件的创建委托给指令。为了避免“检查后更改”错误,这些指令需要多个周期来构建整个控制树。这意味着在操作组件类中的任何控件之前,您必须等待一段时间.

此外,如果您尝试使用setValue方法而不是patchValueAngular 甚至会警告你如何处理它。

this.myForm.control.setValue({name: this.name});

ERROR 错误:没有向该组注册表单控件 然而。如果您使用 ngModel,您可能需要检查下一个刻度(例如 使用setTimeout)。

因此,正如您已经发现的那样,您必须使用[ngModel]绑定或等待下一个刻度,例如使用setTimeout or requestAnimationFrame

如果你想在 ngAfterViewInit 钩子中使用它,调度微任务也应该可以工作:

ngAfterViewInit() {
  Promise.resolve().then(() => {
    this.myForm.control.patchValue({ name: this.name });
  });
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 patchValue 为模板驱动表单进行初始化 的相关文章

随机推荐