Можно ли вообще вызвать метод автоматически, например, checkValidity(), чтобы установить { 'invalid': false/true } после проверки асинхронной формы (т.е. у меня есть this.uniqueNameValidator.bind( это)) асинхронный вызов)
Проверено https://stackoverflow.com/a/49520534/1225526, но это похоже на вызов метода отправки после действия отправки щелчка.
Попытка Form.valueChanges не работает должным образом, она вызывается перед проверкой
this.editForm.valueChanges
.pipe(takeUntil(this._onDestroy))
.subscribe(changes => {
if (changes) {
this.onChange(Object.assign({userId: this.userId}, changes));
}
this.checkValidity(); <-- This part is not working as expected it is called before validation
});
checkValidity() {
if (((this.editForm.controls.userName.pristine && this.editForm.controls.userName.pending) ||
!this.editForm.controls.userName.invalid)
&& !this.editForm.controls.password.invalid) {
this.editForm.setErrors({ 'invalid': false });
} else {
this.editForm.setErrors({ 'invalid': true });
}
}
this.editForm = new FormGroup({
userDisplayName: new FormControl({ value: '', disabled: true }),
userName: new FormControl('', [ Validators.required],
this.uniqueNameValidator.bind(this)), <-- async Validation
password: new FormControl('',[Validators.required,
validateUserPassword()])});
uniqueNameValidator(control: AbstractControl) {
return control.valueChanges.pipe(
switchMap(() => this.service.checkUsernameAvailability(control.value)),
take(1),
map(({data}) => {
control.markAsTouched();
this.componentChangeDetector.markForCheck();
return data.checkUsernameAvailability ? null : {invalid: false};
}), catchError((error): any => {
return of(null);
}));
}
Любая помощь будет здорово.
tap(()=>control.parent.setErrors({'invalid':true}))...
- person Eldar   schedule 12.11.2019