我正在尝试使用自定义验证器查找重复的经销商名称。经销商名称数据来自网络服务。我有经销商服务来获取经销商数据。我在组件内的 validDelarName 函数中使用它进行经销商重复验证。我在 FromGroup 验证器上声明它,但它没有被调用。
Form Group Validator - declare
name: ['', Validators.compose([Validators.required, Validators.maxLength(128),Validators.pattern('[a-zA-Z0-9\\s\\-\\,\\.\\&\\(\\)]+'),(control:FormControl)=>this.validDelarName])],
验证功能。它也存在于组件中。
validDelarName(FormControl){
const dealer = this.dealer.getviewdealer().subscribe( //getting data using webservices
(data) => {
data.forEach(items => {
for (var key in items) {
if (items.hasOwnProperty(key)) {
if(control.value == items['dealername']){
return {valid:true;}
}
else{
retrun null;
}
}
}
});
}
);
}
首先,你的代码有很多错误,我们来列举一下:
1 - 由于您的自定义验证器validDelarName
是async
,所以它必须作为第三个。参数,像这样:
name: [
'',
[
Validators.required,
Validators.maxLength(128),
Validators.pattern('[a-zA-Z0-9\\s\\-\\,\\.\\&\\(\\)]+')
],
(control: AbstractControl) => this.validDelarName // Fix later
]
2 - 您必须将控件或上下文传递给您的自定义验证器,如下所示:
(control: AbstractControl) => this.validDelarName(control)
或者,如果您更喜欢:
this.validDelarName.bind(this)
3 -validDelarName
的签名有误,应该是这样的:
validDelarName(control: AbstractControl) { ... }
4 -async
验证器等待或 aPromise
或 anObservable
并且您仅null | errorObj
在 中返回forEach
,而该 没有做任何事情。
解决方案:
而不是subscribe
您可以使用map
运算符(或者如果您愿意,您可以使用 Promise)并让 Angular 完成他的工作。
要搜索您的特定值,array
我建议您使用Array#some。如果在数组中找到键入的文本,它将返回 true 并自动停止循环,否则它将返回 false。
基于此,您可以返回错误 object
或空值,如下所示:
validDelarName(control: AbstractControl) {
return this.dealer.getviewdealer().map(data => {
const hasItem: boolean = data.some(item => control.value === item['dealername']);
return hasItem ? { valid: true } : null;
});
}
5 - 正如您在上面看到的,您不需要迭代data
对象的所有键(正如您正在做的那样),因为您只想比较dealername
.
6(小错误) - 你有一个错字retrun null;
,应该是return null;
:)。
7(归功于@yurzui) - return {valid:true;} should be return { valid: true };
尖端:
1 -Validators.compose
不需要,您可以只array
在两个参数(第二个和第三个)中传递,或者如果它是单个验证器,则是验证器本身。
2 -Validators.pattern
接受 a RegExp
,因此您可以使用它。
为什么?不是用双斜线转义符号,你只能转义一个斜线和 IMO,它更具可读性。
样品:
Validators.pattern(/^[a-zA-Z0-9\s-\,\.&\(\)]+$/)
另外,请注意,并非此处的所有符号都需要转义(我去掉了不需要的转义)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句