是否可以在无状态表单控件上触发statusChanges而又不触发valueChanges?

时间:2019-07-01 08:45:11

标签: angular angular-reactive-forms

我有一个FormGroup,其中包含多个嵌套的组和控件。其中大多数包含验证器,例如Validators.required。每当用户单击“提交”按钮时,我都会递归遍历表单,以确保触发每个验证器并且每个控件均有效。通过将每个控件标记为已触摸并调用control.updateValueAndValidity()

但是,这会同时触发valueChangedstatusChanged事件。我已将订阅者添加到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'

1 个答案:

答案 0 :(得分:1)

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

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