返回顶部
首页 > 资讯 > 前端开发 > node.js >angular如何实现异步验证防抖
  • 850
分享到

angular如何实现异步验证防抖

2024-04-02 19:04:59 850人浏览 安东尼
摘要

小编给大家分享一下angular如何实现异步验证防抖,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言本周的一个需求是在一个异步

小编给大家分享一下angular如何实现异步验证防抖,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

前言

本周的一个需求是在一个异步验证上加上防抖,防抖,以前也接触过,依稀记得不难,就没再去看angluar的官方文档,直接就开始Google写了,然后……一不小心就掉坑里了。

突然没了效果的验证功能

在网上一番查询以后,选了一个最简单,最符合的实现

angular如何实现异步验证防抖

一番修改以后我的代码成了下面这样

 public oldPassWordValidator(): AsyncValidatorFn {
  return (ctrl: AbstractControl): Promise<ValidationErrors | null> | Observable<ValidationErrors | null> => {
  rerutn ctrl.valueChanges.pipe(
    debounceTime(2000),
    distinctUntilChanged(),
    switchMap(value => this.checkPasswordIsRight(value)),
    map((isRight: boolean) => (isRight ? null : {passwordError: true})),
    catchError(() => null));
  };

但是验证器并没有效果,在c层获取到的始终是null,而在方法中打印结果,却可以发现,能够产生正确的结果

angular如何实现异步验证防抖

但是获取到的相关错误一直是没有,更让我感到惊讶的是表单的valid和invalid竟然同时处在了false,他们不是应该互斥吗?不是反义词吗?

angular如何实现异步验证防抖

FormControl的status

首先还是解决valid与invalid的疑惑吧,查询官方文档。

FORMControl的status继承自AbstractControl

AbstractControl是 FormControl、FormGroup 和 FormArray 的基类。它提供了一些所有控件和控件组共有的行为,比如运行验证器、计算状态和重置状态。 它还定义了一些所有子类共享的属性,如 value、valid 和 dirty。不允许直接实例化它。

找到valid

angular如何实现异步验证防抖

至此,这个疑问解决了,互斥的并不仅仅是valid和invalid,

还有一个检查进行状态:pending和禁止disable,验证一下,果然此时的状态是在pending

angular如何实现异步验证防抖

为何会一直在pending状态?

接着查看表单验证的官方文档

自定义异步验证器和同步验证器很像,只是它们必须返回一个稍后会输出 null 或“验证错误对象”的承诺(Promise)或可观察对象,如果是可观察对象,那么它必须在某个时间点被完成(complete),那时候这个表单就会使用它输出的最后一个值作为验证结果。(译注:Http 服务是自动完成的,但是某些自定义的可观察对象可能需要手动调用 complete 方法)
返回的可观察对象必须是有限的,也就是说,它必须在某个时间点结束(complete)。要把无尽的可观察对象转换成有限的,可以使用 first、last、take 或 takeUntil 等过滤型管道对其进行处理。

结果很明显了,上面的观察者对象是通过valueChangs产生的, 被人订阅后,并不会主动的调用complete()方法,而会不停的发布新值。下面的例子可以看出来

angular如何实现异步验证防抖

给他加个first()让他只返回第一个结果,果然好使了:

angular如何实现异步验证防抖

first(predicate: function(value: T, index: number, source: Observable<T>): boolean, resultSelector:function(value: T, index: number): R, defaultValue: R): Observable<T | R>
只发出由源 Observable 所发出的值中第一个(或第一个满足条件的值)。

如果你足够细心

angular如何实现异步验证防抖

看的太不仔细了,到解决这个问题之前,一直都没发现……

一个更简单的实现方式

验证的防抖功能实际上并不需要通过上面的方式实现,尽管上面也并不困难。

最简单的防抖方式,在官方文档已经提供了:

默认情况下,每当表单值变化之后,都会执行所有验证器。对于同步验证器,没有什么会显著影响应用性能的地方。不过,异步验证器通常会执行某种 HTTP 请求来对控件进行验证。如果在每次按键之后都发出 HTTP 请求会给后端 api 带来沉重的负担,应该尽量避免。

我们可以把updateOn属性从change(默认值)改成submit或blur来推迟表单验证的更新时机。

 
 initForm() {
  this.modifyPasswordForm = this.fb.group({
    oldPassword: [null, [Validators.required], [this.userService.oldPasswordValidator()]],
    newPassword: [null, Validators.required],
    confirmNewPassword: [null, Validators.required]

    // updateOn 作用是在什么时候更新表单数据
    // https://angular.cn/guide/form-validation#note-on-performance
   }, {updateOn: 'blur'},
  );
 }

以上是“angular如何实现异步验证防抖”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网node.js频道!

--结束END--

本文标题: angular如何实现异步验证防抖

本文链接: https://lsjlt.com/news/78945.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • angular如何实现异步验证防抖
    小编给大家分享一下angular如何实现异步验证防抖,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言本周的一个需求是在一个异步...
    99+
    2024-04-02
  • angular异步验证器防抖实例详解
    目录背景:防抖节流定义:代码实现:疑惑first()的使用单元测试fakeAsync;题外补充总结背景: 当前输入框的formControl设置了异步验证器,会根据当前的值进行请求后...
    99+
    2024-04-02
  • angular异步验证器防抖的方法
    本篇内容介绍了“angular异步验证器防抖的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!背景:当前输入框的formControl设置...
    99+
    2023-06-29
  • angular如何实现form验证
    这篇文章主要为大家展示了“angular如何实现form验证”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“angular如何实现form验证”这篇文章吧。先上效...
    99+
    2024-04-02
  • Angular如何实现Reactive Form表单验证
    这篇文章主要介绍了Angular如何实现Reactive Form表单验证,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。基础知识内建验证规则...
    99+
    2024-04-02
  • Ajax如何实现异步用户名验证功能
    这篇文章给大家分享的是有关Ajax如何实现异步用户名验证功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。先看看布局比较简单,效果图如下ajax功能:    当用户填写好账号切换到密...
    99+
    2023-06-08
  • angular如何实现增删改查和验证
    小编给大家分享一下angular如何实现增删改查和验证 ,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!代码如下:<!DOC...
    99+
    2024-04-02
  • angular如何实现表单验证器验证的同时限制输入
    小编给大家分享一下angular如何实现表单验证器验证的同时限制输入,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!angular...
    99+
    2024-04-02
  • angular如何实现基于ng-messages的表单验证
    这篇文章给大家分享的是有关angular如何实现基于ng-messages的表单验证的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。html <div c...
    99+
    2024-04-02
  • java异地登录验证如何实现
    要实现Java的异地登录验证,可以通过以下步骤进行操作:1. 在用户登录成功后,将用户的登录信息存储到数据库或缓存中,包括用户ID、...
    99+
    2023-08-22
    java
  • JavaScript如何实现函数防抖
    这篇文章主要介绍了JavaScript如何实现函数防抖,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。函数防抖leading 为是否在进入时立即执行一次, trailing 为...
    99+
    2023-06-27
  • Ajax中怎么实现异步传输与验证
    本篇文章为大家展示了Ajax中怎么实现异步传输与验证,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。代码如下:<script type="text/j...
    99+
    2024-04-02
  • JavaScript如何实现防抖与节流
    这篇文章主要介绍了JavaScript如何实现防抖与节流,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。概念防抖:点击N次提交按钮,只有最后一次会发出请求。减少无效请求的次数。...
    99+
    2023-06-29
  • js如何实现防抖和节流
    这篇文章给大家分享的是有关js如何实现防抖和节流的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。防抖 & 节流防抖和节流属于高阶技巧,业务中比较多见的场合也就是搜索内容改变提示信息。即使不加也也不一定能看出...
    99+
    2023-06-27
  • Angular如何使用输入框实现自定义验证功能
    这篇文章将为大家详细讲解有关Angular如何使用输入框实现自定义验证功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。此插件使用angular.js、JQuery实现。...
    99+
    2024-04-02
  • 如何实现VBScript验证
    本篇内容介绍了“如何实现VBScript验证”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!简单验证使用 Visual Basic Scrip...
    99+
    2023-06-09
  • JavaFx如何实现按钮防抖功能
    这篇文章主要介绍了JavaFx如何实现按钮防抖功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。JavaFXJavaFX 是一个开源的下一代客户端应用平台,适用于基于Java...
    99+
    2023-06-28
  • Css3如何实现无缝滚动防抖
    这篇“Css3如何实现无缝滚动防抖”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“Css3如何实现无缝滚动防抖”,小编整理了以下知识点,请大家跟着小编的步伐一步一步的慢慢理解,接下来就让我们进入...
    99+
    2023-06-08
  • 怎么用Ajax异步方式实现登录与验证
    这篇文章主要介绍“怎么用Ajax异步方式实现登录与验证”,在日常操作中,相信很多人在怎么用Ajax异步方式实现登录与验证问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用A...
    99+
    2024-04-02
  • Ajax+Struts2如何实现验证码验证功能
    这篇文章主要为大家展示了“Ajax+Struts2如何实现验证码验证功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Ajax+Struts2如何实现验证码验证...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作