我正在通过patchValue从我的组件更新反应FormGroup
控制值。
例如:
this.myForm.patchValue({incidentDate:'2016-09-12');
效果很好并触发valueChanges
事件,但此控件的dirty
属性仍为false
。
我需要incidentDate
控件为dirty
,因此我的验证逻辑知道要针对此控件运行。
如何更新组件中控件的值并指示它是否为脏?
这是我的验证逻辑:
onValueChanged(data?: any) {
if (!this.myForm) {
return;
}
const form = this.myForm;
for (const field in this.formErrors) {
// clear previous error message (if any)
this.formErrors[field] = '';
const control = form.get(field);
if (control && control.dirty && !control.valid) {
const messages: any = this.validationMessages[field];
for (const key in control.errors) {
this.formErrors[field] += messages[key] + ' ';
}
}
}
}
答案 0 :(得分:32)
我通常这样做:
this.formControl.markAsDirty()
或者在你的情况下可能是:
this.myForm.get('incidentDate').markAsDirty()
答案 1 :(得分:1)
如果您有一个需要标记为脏的组或阵列,则可以使用此
export class Helpers {
/**
* Loop and touch all it has
*
* @param {FormGroup} formGroup
* @param func << function name: [markAsTouched, markAsUntouched, markAsDirty, markAsPristine, markAsPending
* @param opts
*
*/
public static touchAll(formGroup: FormGroup|FormArray, func = 'markAsDirty', opts = {onlySelf: false}): void {
mapValues(formGroup.controls, (c, i) => {
if (c instanceof FormGroup || c instanceof FormArray)
Helpers.touchAll(c, func, opts);
else
c[func](opts);
})
}
}
您可以使用SuperForm npm package为您执行此操作。
答案 2 :(得分:0)
在FormGroup中标记为脏控件(仅包含值的控件)
markDirtyAllControlsWithValue(form: FormGroup): void {
const recursiveFunc = (formGroup: FormGroup) => {
Object.keys(formGroup.controls).forEach(field => {
const control = formGroup.get(field);
if (control.value !== null && control.value !== undefined && control.value !== '') {
control.markAsDirty();
}
if (control instanceof FormGroup) {
recursiveFunc(control);
}
});
};
recursiveFunc(form);
}