来自API调用的Angular 8 FormGroup异步验证



我需要验证唯一的产品标题,除了当前产品id。

请注意,我需要使用异步验证-API服务调用来验证FormGroup

函数包含硬编码值2,请忽略它。

产品组件.ts

ngOnInit() {
this.productForm = this.fb.group({
categoryId: ['', [Validators.required]],
title: ['', [Validators.required]],
description: [''],
oldPrice: ['', [Validators.required, Validators.maxLength(10), Validators.pattern('^\d+$')]],
newPrice: ['', [Validators.required, Validators.maxLength(10), Validators.pattern('^\d+$')]]
}, 
// {validators: ValidateUniqueProductTitle.checkProductTitle(this.productService, 2)}
{asyncValidators: [ValidateUniqueProductTitle.checkProductTitle(this.productService, 2)]}
);

验证类:

export class ValidateUniqueProductTitle {
public static checkProductTitle(productService: ProductService, productId) {
return (group: AbstractControl): Observable<ValidationErrors | null> => {
return productService.checkExisting(group.controls['title'].value, productId)
.pipe(
debounceTime(200),
distinctUntilChanged(),
take(1),
map((data: boolean) => {
console.log('checkExisting api called', data);
return data ?  {title_exists: true} : null;
})
); 
}
}

问题:

当我使用以下行时,验证类函数从未被调用:

{asyncValidators:[ValidateUniqueProductTitle.checkProductTitle(this.productService, 2)]}

当我使用这行时,函数被调用,但API没有被激发:

{validators: ValidateUniqueProductTitle.checkProductTitle(this.productService, 2)}

这是一个愚蠢的错误。应该使用FormGroup而不是Abstract Control类型作为回报。

验证类:

export class ValidateUniqueProductTitle {
public static checkProductTitle(productService: ProductService, productId) {
return (group: AbstractControl): Observable<ValidationErrors | null> => {
return productService.checkExisting(group.controls['title'].value, productId)
.pipe(
debounceTime(200),
distinctUntilChanged(),
take(1),
map((data: boolean) => {
console.log('checkExisting api called', data);
return data ?  {title_exists: true} : null;
})
); 
}
} 

此外,需要注意的是:

只有当所有同步验证器返回null时,异步验证器才会被激发。

我原以为所有验证错误(同步和异步(都会同时出现,但这并没有发生。

最新更新