Angular VM Ware clarity design form自定义验证未显示或未清除错误类

Angular VM Ware clarity design form自定义验证未显示或未清除错误类,angular,vmware-clarity,Angular,Vmware Clarity,我正在尝试使用最新版本的clarity and angular获取表单的自定义验证,但在成功验证或失败后,此自定义错误的clr控制错误不会显示在Ui上,调用确实会被触发,它会验证但也不会删除有效场景中的.clr错误,但会将文本框保留为红色,也不会删除感叹号圈,这与 //我正在使用的组件 构造函数(私有数据服务:数据服务,私有fb:FormBuilder,私有sm:FormValidationClass){ this.step1Form=新表单组({ csiAppId:新FormControl

我正在尝试使用最新版本的clarity and angular获取表单的自定义验证,但在成功验证或失败后,此自定义错误的clr控制错误不会显示在Ui上,调用确实会被触发,它会验证但也不会删除有效场景中的.clr错误,但会将文本框保留为红色,也不会删除感叹号圈,这与

//我正在使用的组件
构造函数(私有数据服务:数据服务,私有fb:FormBuilder,私有sm:FormValidationClass){
this.step1Form=新表单组({
csiAppId:新FormControl(空{
验证器:[validators.required,sm.csiAppIdValidator('csiAppId')],
更新:“模糊”
}),
环境:新表单控件(空{
验证器:[验证器。必需]
}),
appInstanceIdentifier:new FormControl(null{
验证器:[验证器。必需]
}),
SNOWappInstanceIdentifier:new FormControl(null{
验证器:[验证器。必需]
}),
sltnNumber:new FormControl(空{
验证器:[验证器。必需]
}),
});
}
//我尝试调用rest服务的验证器
@可注射({providedIn:'root'})
导出类FormValidationClass实现OnInit{
appIdValuator:string='true';
构造函数(公共httpClient:httpClient,私有dataService:dataService){
}
ngOnInit():void{
}
csiAppIdValidator(csiAppId:string):验证器fn{
返回(控件:FormControl)=>{
如果(!控制){
返回null;
}
返回此.httpClient.get(“/wscrp/cloudvcac/services/rest/validateapid/”+control.value)
.订阅(
(结果:任何)=>{
console.log(“>>>”+result.status);
如果(result.status==“Success”){
警报(“有效”);
返回null;
}否则{
警报(“无效”);
返回{invalidAppId:true}
}
}
);
//返回空值
};
}
}

CSI应用程序ID
CSI应用程序ID是必需的!
Csi AppID无效!

您在这里犯了两个错误:

  • 将异步验证程序替换为同步验证程序
以下是正确的初始化:

csiAppId: new FormControl(null, {
   validators: [Validators.required],
   asyncValidators: [sm.csiAppIdValidator('csiAppId')], <--- async validators go here
   updateOn: 'blur'
}),
请使用这个,我通过提供简单的可观察性来模拟http请求。您可以在
AppID
字段中输入一些内容,它应该从4个字母开始失败


注意:验证只在focusout上进行

谢谢@yurzui当你这么做的时候非常简单,一些优雅漂亮的代码
csiAppIdValidator(csiAppId: string): AsyncValidatorFn {
  return (control: FormControl): Observable<ValidationErrors | null> => {
    if (!control) {
      return null;
    }

    return this.httpClient.get('/wscrp/cloudvcac/services/rest/validateAppId/' + control.value)
      .pipe(map((result: any) => result.status === 'Success' ? null : { invalidAppId: true }));
  };
}