我有一个FormGroup
,其中包含多个嵌套的组和控件。其中大多数包含验证器,例如Validators.required
。每当用户单击“提交”按钮时,我都会递归遍历表单,以确保触发每个验证器并且每个控件均有效。通过将每个控件标记为已触摸并调用control.updateValueAndValidity()
。
但是,这会同时触发valueChanged
和statusChanged
事件。我已将订阅者添加到statusChanged
事件中,该事件应该可以处理任何错误,但是由于值没有更改,因此我不希望触发valueChanged
。
是否可以在不触发statusChanged
的情况下手动触发valueChanged
?将{ emitEvent: false }
传递到updateValueAndValidity
将防止两个事件都被触发。
public ngOnInit(): void {
const form = this.formBuilder.group({
'name': ['', Validators.required],
'address': this.formBuilder.group({
'street': ['', Validators.required],
'number': ['', Validators.required]
})
});
form.valueChanges.subscribe(() => console.log('Should not fire'));
form.statusChanges.subscribe(() => console.log('Should fire'));
this.validateForm(form);
console.log(form.valid);
}
private validateForm(control: AbstractControl): void {
if (control instanceof FormControl) {
control.markAsTouched();
control.markAsDirty();
control.updateValueAndValidity();
} else if (control instanceof FormGroup) {
Object.keys(control.controls).forEach(field => {
this.validateForm(control.get(field));
});
}
}
// should print 'Should fire' and 'false' but not 'Should not fire'
答案 0 :(得分:1)
statusChanges属性实际上是一个EventEmitter,因此可以将其强制转换为手动发出状态:
(<EventEmitter<any>> control.statusChanges).emit(control.status);