Angular 是否可以在不触发被动表单控件上的值更改的情况下触发状态更改?

Angular 是否可以在不触发被动表单控件上的值更改的情况下触发状态更改?,angular,angular-reactive-forms,Angular,Angular Reactive Forms,我有一个带有多个嵌套组和控件的FormGroup。其中大多数包含验证器,如验证器。必需的。每当用户单击submit按钮时,我就递归地遍历表单,以确保每个验证器都被触发,并且每个控件都有效。这是通过将每个控件标记为已触摸并调用control.updateValue和validity()来实现的 但是,这会触发valueChanged和statusChanged事件。我已将订阅服务器添加到statusChanged事件中,该事件将处理任何错误,但我不希望触发valueChanged,因为该值没有更改

我有一个带有多个嵌套组和控件的
FormGroup
。其中大多数包含验证器,如
验证器。必需的
。每当用户单击submit按钮时,我就递归地遍历表单,以确保每个验证器都被触发,并且每个控件都有效。这是通过将每个控件标记为已触摸并调用
control.updateValue和validity()
来实现的

但是,这会触发
valueChanged
statusChanged
事件。我已将订阅服务器添加到
statusChanged
事件中,该事件将处理任何错误,但我不希望触发
valueChanged
,因为该值没有更改

是否可以在不触发
valueChanged
的情况下手动触发
statusChanged
?将
{emitteevent: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'

statusChanges属性实际上是一个EventEmitter,因此可以将其强制转换为手动发出状态:

(<EventEmitter<any>> control.statusChanges).emit(control.status);
(control.statusChanges).emit(control.status);

为什么不使用?使用验证器,您只需检查表单的全局验证即可。@ThierryValvo您能给我一个示例,使我的代码示例能够工作吗?我不太明白如何使用自定义验证器来解决这个问题。也许我不清楚您的需要。为什么validateForm的目标是什么?Angular doc(提供的链接)中提到的自定义验证器使您能够检查和验证每个表单控件,然后无需迭代每个字段来手动检查它们。@ThierryValvo,因为我订阅了
statusChanges
以侦听验证更改。无论何时触发,我都会检查任何验证错误并将其显示给用户。根据angular的说法,这是一个“每次控件的验证状态重新计算时都会发出一个事件的多播可观察对象”,这似乎非常适合我使用它的目的。如果我没有调用validateForm,将永远不会触发值更改,也不会显示任何验证消息。我的意思是,使用自定义验证器可以避免这样做,错误可能会显示在模板
Name cannot be Bob.
中。如果你的申请无效,你必须避免提交表格。请考虑在你的答案中加上一些解释和细节。虽然它可能回答了这个问题,但仅仅添加一些代码并不能帮助OP或未来的社区成员理解问题或解决方案。注意,我已经为解决方案添加了更多细节。