Я использую угловой 7, реактивная форма.
У меня есть требование проверить наличие определенного значения на сервере, чтобы сделать поле действительным / недействительным.
Класс компонентов:
Контроль:
valueControl = new FormControl("" ,Validators.required,
), [this.valueIsUnique.bind(this)]);
/**
* Validator to checking existance/uniqueness
* of entered value
* @param control
*/
valueIsUnique(control: AbstractControl): Promise<ValidationErrors|null> | null {
if (control && (control.value !== null && control.value !== undefined)) {
return new Promise((resolve, reject) => {
this.service.checkValueExists(control.value, this.organizationId).subscribe(res => {
{
if (res && res['data']) {
resolve({
unique: true
});
}
else {
resolve(null);
}
}
},
err=>
{
resolve(null);
});
});
}
}
**Service:**
checkValueExists(value:string) {
return this._http.get(`${API}/${value}/exists`, {
headers: ...
}
);
}
Теперь это работает нормально.
Но я не хочу делать контроль обязательным, т.е. Validators.required. Поэтому в качестве хака я добавил Validators.minLength (1) в качестве проверки синхронизации, но это выдает ошибку:
Ошибка: ожидаемый валидатор вернет Promise или Observable.
в toObservable (forms.js: 603)
в Array.map ()
at forms.js: 591
at forms.js: 611
в Array.map ()
в _executeAsyncValidators (forms.js: 611)
в FormControl.asyncValidator (forms.js: 591)
at FormControl.push ../ node_modules/@angular/forms/fesm5/forms.js.AbstractControl._runAsyncValidator
(forms.js: 2535)
at FormControl.push ../ node_modules/@angular/forms/fesm5/forms.js.AbstractControl.updateValueAndValidity
(forms.js: 2508)
в FormControlDirective.push ../ node_modules/@angular/forms/fesm5/forms.js.FormControlDirective.ngOnChanges
(forms.js: 4463)
Есть ли способ добавить асинхронную проверку без добавления проверки синхронизации в качестве второго параметра:
Взял ссылку от этого ТАК / вопроса