是否可以在不响应表单控件上触发statusChanges而不触发valueChanges?

问题描述 投票:1回答:1

我有一个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'
angular angular-reactive-forms
1个回答
0
投票
(<EventEmitter<any>> control.statusChanges).emit(control.status);
© www.soinside.com 2019 - 2024. All rights reserved.