我有一个利用反应形式的Angular 8应用程序。我有嵌套的formGroups,并且验证程序正常工作。从另一个页面,我传递了一个状态对象,其中包含一个“记录”,该记录用于预填充该页面上表单的字段。我正在遍历表单控件,并在这些控件上调用setValue(),这按预期工作。但是,在提交该预先填充的表单(我使用的按钮不是ng-submit)时,验证器看不到setValue()设置的值,并认为控件无效。
我尝试了所有.markAs
方法和.updateValueAndValidity()
,但没有一个起作用。我已经在单个控件,它们的组以及整个窗体上对其进行了尝试。
我已删除我的.markAs
和.updateValueAndValidity()
通话:
populateSurvey(record): void {
for (const i in this.surveyForm.controls) {
if (record.hasOwnProperty(i)) {
// this gets top level formControls
const control = this.surveyForm.get(i);
control.setValue(record[i]);
} else {
// this gets formGroup.controls of nested formControls
const fGroup = this.surveyForm.controls[i] as FormGroup;
const controls = fGroup.controls;
for (const j in controls) {
if (record.hasOwnProperty(j)) {
const control = this.surveyForm.get(i + '.' + j);
if (record[j] === 1) {
control.setValue(record[j]);
}
}
}
}
}
}
这是我表单的截断版本:
this.surveyForm = this.formBuilder.group({
eMail: [''],
org: ['', Validators.required],
site: ['', Validators.required],
actId: ['', Validators.required],
state: ['', Validators.required],
county: ['', Validators.required],
beachDescriptors: new FormGroup({
bdDeep: new FormControl(),
bdShallow: new FormControl(),
bdOpen: new FormControl(),
bdEmbayed: new FormControl(),
bdFresh: new FormControl(),
bdMarine: new FormControl(),
bdPier: new FormControl(),
bdDrain: new FormControl(),
bdOther: new FormControl({ value: '', disabled: true }, Validators.minLength(1))
}, this.groupValidator()),
...
});
预期的行为:
用户单击查询页面上的填充表单按钮,调查页面上的表单将填充record.values
(有效)。
用户提交预填充的表单,验证器将验证包含预填充字段的页面(手动输入的值将按预期工作)。