我的应用程序中有一个复杂的表单.其中一部分要求提供地址,他们必须输入物理地址.有一个复选框用于标记邮寄地址是否相同.如果是,则邮寄地址字段不是必填项(这是默认设置).如果取消选中该复选框,则需要输入邮寄地址.这种方法是有效的,因为最初不需要邮寄地址,但在取消选中该框后,邮寄地址就变成必需的.但如果他们再次判断,他们仍然被要求输入邮寄地址.下面是相关的代码片段:
// form declaration
const personalInfoForm = this._fb.group(
{
sameAddress: [true],
physicalAddress: this._fb.group({
line1: [
"",
[Validators.required, MhaValidators.validPhysicalStreetAddress],
],
city: ["", [Validators.required]],
state: ["", [Validators.required]],
zip: ["", [Validators.required, MhaValidators.validZipCode]],
}),
mailingAddress: this._fb.group({
line1: [""],
city: [""],
state: [""],
zip: [""],
}),
}
);
// valueChanges for same address
this.personalInfoForm
.get("sameAddress")
.valueChanges.pipe(
startWith(this.personalInfoForm.get("sameAddress").value),
tap((sameAddress: boolean) => {
if (sameAddress) {
this.personalInfoForm.controls.mailingAddress = this._fb.group({
line1: [""],
city: [""],
state: [""],
zip: [""],
});
} else {
this.personalInfoForm.controls.mailingAddress = this._fb.group({
line1: ["", [Validators.required]],
city: ["", [Validators.required]],
state: ["", [Validators.required]],
zip: ["", [Validators.required, MhaValidators.validZipCode]],
});
}
this.personalInfoForm.controls.mailingAddress.updateValueAndValidity();
this.personalInfoForm.updateValueAndValidity();
}),
untilDestroyed(this)
)
.subscribe();
// I also tried this for updating the validators:
this.personalInfoForm
.get("sameAddress")
.valueChanges.pipe(
startWith(this.personalInfoForm.get("sameAddress").value),
tap((sameAddress: boolean) => {
const mailingAddress: FormGroup = this.personalInfoForm.get(
"mailingAddress"
) as FormGroup;
if (sameAddress) {
// remove validators from mailing address
mailingAddress.get("line1").clearValidators();
mailingAddress.get("city").clearValidators();
mailingAddress.get("state").clearValidators();
mailingAddress.get("zip").clearValidators();
} else {
// add validators to mailing address
mailingAddress.get("line1").addValidators([Validators.required]);
mailingAddress.get("city").addValidators([Validators.required]);
mailingAddress.get("state").addValidators([Validators.required]);
mailingAddress
.get("zip")
.addValidators([Validators.required, MhaValidators.validZipCode]);
}
this.personalInfoForm.updateValueAndValidity();
}),
untilDestroyed(this)
)
.subscribe();
本质上,我想在sameAddress
控件在true和false之间来回切换时添加或删除字段的验证器.
目前,如果它们不更改相同的地址控件,则该表单在技术上是有效的.如果他们取消选中,则需要填写邮寄地址,即使他们重新选中该复选框也是如此.
我不确定为什么有效性没有正确更新.知道为什么吗?