如何从异步请求(表单控件)初始化 Angular 表单的默认值
How to init default values for Angular Form from async request (form control)
我的网站上有设置,我需要用默认值填充所有字段 - 我的用户的当前设置。
用户输入他的设置后,我发出一个异步 GET 请求,完成后,我需要将他的设置作为默认值传递到我的表单字段。
据我所知,我可以使用以下语法传递默认值:
this.validateForm = this.fb.group({
language: ['default_value', [Validators.nullValidator]],
timeZone: ['default_value', [Validators.nullValidator]],
firstName: ['default_value', [Validators.nullValidator]],
lastName: ['default_value', [Validators.nullValidator]],
gender: ['default_value', [Validators.nullValidator]],
address: ['default_value', [Validators.nullValidator]]
});
但是你看,Angular 需要我在构造函数中立即初始化这个表单组,但我不能,因为异步请求需要一些时间,直到它,字段必须为空。
此外,我认为在 HTML 中执行此操作要容易得多,例如通过使用 ngModel,但它不适用于 formControl 或 [value],但这也不是解决方案,因为表单控件只是忽略信息,我传递给 [value] 属性并且它无法将 [value] 传递给 select,因为我不仅使用常规 HTML,而且使用 Ng-Zorro而且它没有 [value] 属性。
您可以在使用 setValue
方法从 api 调用中获取值后再次设置表单的值。
样本:
this.service.functionName().subscribe((res) => {
this.validateForm.setValue({
language: res.language,
firstName: res.firstName
})
})
如果您只想在异步请求完成后更新表单的几个值。
您必须使用 patchValue() 而不是 setValue()。
由于 setValue() 用于设置您的表单获得的所有表单控件,您可以使用 patchValue() 仅更新您想要更新的少数控件。
因此,要更新完整的表单,请使用 setValue(),setValue() 要求所有控件都具有相应的值,否则它会抛出如下错误:-
this.validateForm.setValue({
language: res.language,
timeZone: res.timeZone,
firstName: res.firstName,
lastName: res.lastName,
gender: res.gender,
address: res.address
})
或者如果只更新少数控件,请像这样选择 patchValue() :-
this.validateForm.patchValue({
language: res.language,
firstName: res.firstName
})
我的网站上有设置,我需要用默认值填充所有字段 - 我的用户的当前设置。
用户输入他的设置后,我发出一个异步 GET 请求,完成后,我需要将他的设置作为默认值传递到我的表单字段。
据我所知,我可以使用以下语法传递默认值:
this.validateForm = this.fb.group({
language: ['default_value', [Validators.nullValidator]],
timeZone: ['default_value', [Validators.nullValidator]],
firstName: ['default_value', [Validators.nullValidator]],
lastName: ['default_value', [Validators.nullValidator]],
gender: ['default_value', [Validators.nullValidator]],
address: ['default_value', [Validators.nullValidator]]
});
但是你看,Angular 需要我在构造函数中立即初始化这个表单组,但我不能,因为异步请求需要一些时间,直到它,字段必须为空。
此外,我认为在 HTML 中执行此操作要容易得多,例如通过使用 ngModel,但它不适用于 formControl 或 [value],但这也不是解决方案,因为表单控件只是忽略信息,我传递给 [value] 属性并且它无法将 [value] 传递给 select,因为我不仅使用常规 HTML,而且使用 Ng-Zorro而且它没有 [value] 属性。
您可以在使用 setValue
方法从 api 调用中获取值后再次设置表单的值。
样本:
this.service.functionName().subscribe((res) => {
this.validateForm.setValue({
language: res.language,
firstName: res.firstName
})
})
如果您只想在异步请求完成后更新表单的几个值。 您必须使用 patchValue() 而不是 setValue()。
由于 setValue() 用于设置您的表单获得的所有表单控件,您可以使用 patchValue() 仅更新您想要更新的少数控件。
因此,要更新完整的表单,请使用 setValue(),setValue() 要求所有控件都具有相应的值,否则它会抛出如下错误:-
this.validateForm.setValue({
language: res.language,
timeZone: res.timeZone,
firstName: res.firstName,
lastName: res.lastName,
gender: res.gender,
address: res.address
})
或者如果只更新少数控件,请像这样选择 patchValue() :-
this.validateForm.patchValue({
language: res.language,
firstName: res.firstName
})