当前位置: 首页 > 知识库问答 >
问题:

Angular ValidatorFn返回,但不阻塞窗体

贺光华
2023-03-14
ValidateDirectory(clientId: string): ValidatorFn {
        return (control: AbstractControl): ValidationErrors | null => {
            const ret: ValidationErrors = { isValidDirectory: true };
            if (control.value == null || control.value === '') {
                return ret;
            }
            this.service.getList(clientId, control.value).subscribe((res) => {
                if (res.technicalRetCode !== 0) {
                    console.log(ret);
                    return ret;
                }
                return null;
            });
            return null;
        };
    }
ngOnInit() {
  ...
  this.fourthFormGroup = this._formBuilder.group({
      dateipfad: ['', {validator: Validators.compose([Validators.required, this.directoryValidator.ValidateDirectory(this.clientID)]), updateOn: 'blur'}]
    });
  ... 
}

我已经尝试了很多,比如使用validators和array一起使用validators.compose,调整了我的Validator方法来设置control.seterrors(ret)其他一些东西,但都没有效果。

我觉得有一个很简单的解决办法,但我就是找不到...

编辑1:我创建了一个stackblitz https://stackblitz.com/EDIT/angular-ysyb9i?file=src%2fapp%2fapp.component.html

说明:输入接受任何字符串,在取消选择时验证开始。如果Input为'false',则应通过返回常量ret:ValidationErrors={isvaliddirectory:true}将Input设置为invalid;,则任何其他字符串都应有效,并返回null

这两个结果都记录在控制台上,所以您可以检查它。如果输入无效,它应该在下面显示一个通知div(不太确定,只是为了这个stackblitz显示而添加了它)

共有1个答案

茹正初
2023-03-14

如果验证器中的代码是异步的,则应该使用异步验证器。

this.fourthFormGroup = this._formBuilder.group({
  dateipfad: ['', {
    validators: [Validators.required],
    asyncValidators: [this.directoryValidator.ValidateDirectory(this.clientID)],
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                    put it here
    updateOn: 'blur'
  }]
});

验证器应该返回AsyncValidatorFn接口,在该接口中,您应该订阅observable,但应该映射到所需的值。Angular将自动订阅您的观察。

ValidateDirectory(clientId: string): AsyncValidatorFn {
  return (control: AbstractControl): 
             Promise<ValidationErrors | null> | Observable<ValidationErrors | null> => {
    const ret: ValidationErrors = { isValidDirectory: true };

    if (control.value == null || control.value === '') {
      return of(ret);
    }

    return this.service.getList(clientId, control.value).pipe(map((res: any) => {
      if (res.technicalRetCode !== 0) {
        return ret;
      }

      return null;
    }));
  };
}

分叉斯塔克布利茨

 类似资料:
  • 我正在使用Spring Webflux和Spring Boot2,我的场景如下: 在返回之前,我如何将来自流量和正常产品列表的结果连接起来?没有反应控制器是可能的吗? 附言。我不想对从调用1获得的结果调用。block()和CompleteableFuture

  • 除了极少数例外 (一些文件系统操作的“同步”结束),没有一个 Vert.x Api 阻塞调用线程。 如果可以立即提供的结果,它将立即返回,你通常会提供一个handle来接收过一段时间的事件。 由于Vert.x API没有任何阻塞的线程,这意味着你可以使用Vert.x来处理只是使用小数目线程的大量并发。 常规阻塞API使用线程可能会阻塞: 从socket读取数据 向磁盘写入数据 向收件人发送一条消息

  • 本文向大家介绍node.js回调函数之阻塞调用与非阻塞调用,包括了node.js回调函数之阻塞调用与非阻塞调用的使用技巧和注意事项,需要的朋友参考一下 首先,node.js作为javascript运行平台,它采用了事件驱动和异步编程的方式,通过事件注册和异步函数,开发人员可以提高资源利用率,服务器的性能也能得到改善。其次,对于前端人来说,node.js作为js的运行平台,我们可以通过编写系统级或者

  • 问题内容: 我有这段代码可以在Linux中从Serial读取,但是我不知道在读取SerialPort时阻塞和非阻塞之间有什么区别,在哪种情况下哪个更好? 问题答案: 您提到的代码是IMO编码和注释不当的代码。该代码不符合POSIX的可移植性惯例,如正确设置终端模式和POSIX操作系统的串行编程指南中所述。该代码没有提到它使用非规范(也称为原始)模式,并且重用了“阻塞”和“非阻塞”术语来描述 VMI

  • 我完全混淆了,,。 哪个是阻塞,哪个不是? 我的意思是如果我使用父进程是否等待子进程返回/才继续执行。 如何影响这些调用?

  • OpenResty 的诞生,一直对外宣传是同步非阻塞(100% non-blocking)的。基于事件通知的 Nginx 给我们带来了足够强悍的高并发支持,但是也对我们的编码有特殊要求。这个特殊要求就是我们的代码,也必须是非阻塞的。如果你的服务端编程生涯一开始就是从异步框架开始的,恭喜你了。但如果你的编程生涯是从同步框架过来的,而且又是刚刚开始深入了解异步框架,那你就要小心了。 Nginx 为了减