我需要验证唯一的产品标题,除了当前的产品id.
请注意,我需要使用异步验证- API服务调用FormGroup来验证。
函数包含硬编码值2,请忽略它。
product-component.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;
})
);
}
}杂志:
当我使用这一行时,永远不会调用Validate类函数:
{asyncValidators:[ValidateUniqueProductTitle.checkProductTitle(this.productService, 2)]}
当我使用这一行时,函数会被调用,但是API不会被触发:
{validators: ValidateUniqueProductTitle.checkProductTitle(this.productService, 2)}
发布于 2020-02-18 05:02:22
这是个愚蠢的错误。应该使用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时,才会触发
异步验证器。
我原以为所有的验证错误(同步和异步)都会同时出现,但这并没有发生。
https://stackoverflow.com/questions/60263980
复制相似问题