返回顶部
首页 > 资讯 > 精选 >angular异步验证器防抖的方法
  • 780
分享到

angular异步验证器防抖的方法

2023-06-29 19:06:15 780人浏览 八月长安
摘要

本篇内容介绍了“angular异步验证器防抖的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!背景:当前输入框的fORMControl设置

本篇内容介绍了“angular异步验证器防抖的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

    背景:

    当前输入框的fORMControl设置了异步验证器,会根据当前的值进行请求后台,判断数据库中是否存在。

    angular异步验证器防抖的方法

    原版异步验证器:

    vehicleBrandNameNotExist(): AsyncValidatorFn {    return (control: AbstractControl): Observable<ValidationErrors | null> => {      if (control.value === '') {        return of(null);      }      return this.vehicleBrandService.existByName(control.value).pipe(map(exists => exists ? {vehicleBrandNameExist: true} : null));    };  }

    但是测试下来发现,该异步验证器触发的太频繁了。输入框每输入一个字母都会对后台进行请求,不利于节省资源。

    防抖节流

    这个相关的操作叫做防抖和节流。什么是防抖和节流?有什么区别?

    本质上是一种优化高频率执行代码的一种手段。

    比如浏览器的鼠标点击,键盘输入等事件触发时,会高频率地调用绑定在事件上的回调函数,一定程度上影响着资源的利用。

    为了优化,我们需要 防抖(debounce) 和 节流(throttle) 的方式来减少调用频率。

    定义:

    防抖: n 秒后在执行该事件,若在 n 秒内被重复触发,则重新计时

    节流: n 秒内只运行一次,若在 n 秒内重复触发,只有一次生效

    举个例子来说明:

    乘坐地铁,过闸机时,每个人进入后3秒后门关闭,等待下一个人进入。

    闸机开之后,等待3秒,如果中又有人通过,3秒等待重新计时,直到3秒后没人通过后关闭,这是防抖

    闸机开之后,每3秒后准时关闭一次,间隔时间执行,这是节流

    代码实现:

    防抖操作恰好符合我们的需求。

    找异步验证器中防抖的代码实现中恰好看到了liyiheng学长的文章:
    https://www.yisu.com/article/175497.htm,于是便参考了一下。

    这里仅是说明angular中formContorl异步验证器如何防抖的步骤:

    创建(改写)异步验证器

    vehicleBrandNameNotExist(): AsyncValidatorFn {    return (control: AbstractControl): Observable<ValidationErrors | null> => {      if (control.value === '') {        return of(null);      }      return control.valueChanges.pipe(        // 防抖时间,单位毫秒        debounceTime(1000),        // 过滤掉重复的元素        distinctUntilChanged(),        // 调用服务, 获取结果        switchMap(value => this.vehicleBrandService.existByName(value)),        // 对结果进行处理,null表示正确,对象表示错误        map((exists: boolean) => (exists ? {vehicleBrandNameExist: true} : null)),        // 每次验证的结果是唯一的,截断流        first()      )    };  }
    • 添加异步验证器

    let formControl = new FormControl('', [], asyncValidate.vehicleBrandNameNotExist());

    之后我们在v层在相关的标签上绑定该fromControl就可以了。

    疑惑

    相关操作到这里就结束了,能够正常使用了。

    但是改写之后还有些疑惑。

    原来的版本是这么使用的:

    return this.vehicleBrandService.existByName(...)

    改写后是这么使用的:

    return control.valueChanges.pipe(...

    改写后使用了valueChanges,也就是产生了一个observable,它使得每当控件的值在更改时,它都会发出一个事件。

    那么,每次调用异步验证器之后,我们每次都用valueChanges,每次的observable是不是同一个?

    于是我进行了测试:
    原理:多次调用异步验证器,并缓存ovservable,如果不相同则输出 “不相等”

    angular异步验证器防抖的方法

    测试结果:如图,只是在第一次初始化的时候输出了不相等,因为第一次observable为undefined, 在有值之后,多次调用异步验证器发现observabel始终是同一个

    angular异步验证器防抖的方法

    first()的使用

    之前也不理解first的使用,看学长的文章之后才明白,first()来避免多次地这样返回值。

    angular异步验证器防抖的方法

    所以我们产生的observable一直处于pending状态,需要用first让它返回第一个值就好。

    return control.valueChanges.pipe(           first() )

    单元测试

    一个好的功能要有一个好的单元测试。

    1 it('should create an instance', async () => { 2   expect(asyncValidate).toBeTruthy(); 3   let formControl = new FormControl('', [], asyncValidate.vehicleBrandNameNotExist()); 4   formControl.setValue('重复车辆品牌'); 5    // 等待防抖结束 6   await new Promise(resolve => setTimeout(resolve, 1000)); 7   getTestScheduler().flush(); 8   expect(formControl.errors.vehicleBrandNameExist).toBeTrue();     ...}));

    原来的时候我写的单元测试说这样的,

    等待防抖结束我用了await new Promise 以及setTimeout。执行到第8行的时候,让线程等待1秒。

    经过老师指正之后,发现这样并不好。假如某个测试需要等待一个小时,那么我们的执行时间就需要1个小时,这显然是不现实的。

    所以这里用到了fakeAsync;

    fakeAsync;

    fakeAsync,字面上就是假异步,实际上还是同步进行的。

    使用tick()模拟时间的异步流逝。

    官方测试代码:

    angular异步验证器防抖的方法

    仿照测试代码:

    我在tick()前后,打印了new Date(),也就是当时的时间,结果是什么呢?

    angular异步验证器防抖的方法

    可以看到第一个打印了17:19:30,也就是当时测试的时间。

    但是在tick(10000000)后,打印的时间是20:06:10, 达到了一个未来的时间。

    并且,这两条语句几乎是同时打印的,也就是说,单元测试并没有让我们真的等待10000000ms。

    angular异步验证器防抖的方法

    所以经过测试时候我们就可以使用tick(1000)和fakeAsync模拟防抖时间结束了。

    it('should create an instance', fakeAsync( () => {    expect(asyncValidate).toBeTruthy();    let formControl = new FormControl('', [], asyncValidate.vehicleBrandNameNotExist());    formControl.setValue('重复车辆品牌');    // 等待防抖结束    tick(1000);    getTestScheduler().flush();    expect(formControl.errors.vehicleBrandNameExist).toBeTrue();  }));

    题外

    写后台的时候还遇到了一个错误:

    angular异步验证器防抖的方法

    它说我color没有设置默认值,但是回去一看明明已经设置了。

    angular异步验证器防抖的方法

    打了很多断点都没发现问题。

    后来到数据库一看,好家伙,怎么有两个,一个是colour,一个是color.

    angular异步验证器防抖的方法

    之后翻看之前提交的代码,发现是之前用的是color,后面换成了colour。

    但是我jpa hibernate设置的是update,所以数据库对应执行的是更新,所以上次的字段并没有删除,这才导致了数据库有两个字段。之后删除其中一个了就没事了。

    jpa:    hibernate:      ddl-auto: update

    补充

    后面谷歌之后发现了一种比较简洁也好理解的方法:

    不用调用first()之类的操作符, 把timer()的返回值作为一个observable就可以了。

    time的作用在这里:
    Https://rxjs-cn.GitHub.io/lea...

    简单来说就是当 timer 结束时发出一个值。

    这个原理猜测可能是当timer还没有结束并重复调用异步验证器时,表单就不管这个timer了,转而关注新的。

    当然只是猜测,有机会再补充,经过测试防抖功能是正常的。

    export class VehicleBrandAsyncValidator {    debounceTime = 1000;    constructor(private vehicleBrandService: VehicleBrandService) { }    vehicleBrandNameNotExist(): AsyncValidatorFn {    return (control: AbstractControl): Observable<ValidationErrors | null> => {      if (control.value === '') {        return of(null);      }      return timer(this.debounceTime).pipe(        // 调用服务, 获取结果        switchMap(() => this.vehicleBrandService.existByName(control.value)),        // 对结果进行处理,null表示正确,对象表示错误        map((exists: boolean) => (exists ? {vehicleBrandNameExist: true} : null)),      )    };  }}

    “angular异步验证器防抖的方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

    --结束END--

    本文标题: angular异步验证器防抖的方法

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

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

    猜你喜欢
    • angular异步验证器防抖的方法
      本篇内容介绍了“angular异步验证器防抖的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!背景:当前输入框的formControl设置...
      99+
      2023-06-29
    • angular异步验证器防抖实例详解
      目录背景:防抖节流定义:代码实现:疑惑first()的使用单元测试fakeAsync;题外补充总结背景: 当前输入框的formControl设置了异步验证器,会根据当前的值进行请求后...
      99+
      2024-04-02
    • angular如何实现异步验证防抖
      小编给大家分享一下angular如何实现异步验证防抖,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言本周的一个需求是在一个异步...
      99+
      2024-04-02
    • angular如何实现表单验证器验证的同时限制输入
      小编给大家分享一下angular如何实现表单验证器验证的同时限制输入,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!angular...
      99+
      2024-04-02
    • PHPCMS验证码显示异常的解决方法
      标题:PHPCMS验证码显示异常的解决方法 随着网络的普及和发展,网站安全问题变得愈加重要。在网站注册、登录等操作中,验证码是一种常见的安全验证手段,能够有效防止机器人恶意攻击。在使用...
      99+
      2024-03-12
      验证码 解决 phpcms 验证码生成
    • Angular优化的方法步骤
      这篇文章主要讲解了“Angular优化的方法步骤”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Angular优化的方法步骤”吧!变更检测机制不同于网络传输优...
      99+
      2024-04-02
    • 怎么用Ajax异步方式实现登录与验证
      这篇文章主要介绍“怎么用Ajax异步方式实现登录与验证”,在日常操作中,相信很多人在怎么用Ajax异步方式实现登录与验证问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用A...
      99+
      2024-04-02
    • Angular跨字段验证器中如何直接调用其它独立的验证器
      目录跨字段验证使用独立的验证器总结在angular中关于表单动态验证的一种新思路一文中我们给出了Angular项目进行字段校验的三种方法。本文我们将重点围绕第一种方法展开讨论。 假设...
      99+
      2024-04-02
    • 阿里云账户验证服务器异常原因、解决方法及预防措施
      阿里云作为全球领先的云计算服务提供商,为广大用户提供稳定、高效的云计算服务。然而,最近有用户反映阿里云账户验证服务器出现异常,导致用户无法正常使用阿里云服务。本文将对这一问题进行详细解析,并提供相应的解决方法和预防措施。 一、阿里云账户验证...
      99+
      2023-11-04
      预防措施 阿里 解决方法
    • PHP 防抖技术:优化用户操作体验的关键一步
      随着互联网技术的不断发展和用户体验的日益重视,网站开发中对用户操作体验的要求也越来越高。而在用户与网站进行交互时,经常会遇到用户频繁操作的情况,这时候就需要采用一种防抖技术来优化用户体验。防抖技术是一种限制函数执行频率的方法,通过设置一个时...
      99+
      2023-10-21
      PHP编程 (PHP programming) 防抖技术 (Debounce) 优化用户体验 (UX Optimizat
    • Angular模板表单的校验方法
      本篇内容介绍了“Angular模板表单的校验方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本文实例为大...
      99+
      2024-04-02
    • 阿里云服务器身份验证异常的解决方法
      阿里云服务器是一款性能稳定、安全可靠的云计算产品。然而,有时在使用过程中可能会遇到一些问题,如身份验证异常。本文将详细介绍如何解决阿里云服务器身份验证异常的问题。 阿里云服务器身份验证异常是指在使用阿里云服务器时,无法进行正常的身份验证操作...
      99+
      2023-11-06
      阿里 解决方法 身份验证
    • vue中防抖和节流的使用方法
      目录前言概念防抖定义使用场景代码在vue中使用节流定义使用场景代码在vue中使用总结前言 在一个电影项目中,我想在电影的列表中,保存下拉的当前位置,防止你切换页面后,再切换回当前的电...
      99+
      2024-04-02
    • Javascript的防抖和节流方法怎么用
      本篇内容主要讲解“Javascript的防抖和节流方法怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Javascript的防抖和节流方法怎么用”吧!1. 什么是防抖【解释】: 防...
      99+
      2023-06-29
    • Vue中使用防抖与节流的方法
      目录何为防抖/节流防抖(debounce)节流(throttle)页面使用使用场景总结何为防抖/节流 首先先说说何为防抖与节流 防抖(debounce) 防抖就是一段时间内会多次触发...
      99+
      2024-04-02
    • springboot验证码的生成与验证的两种方法
      目录前言效果一览(单击图片刷新验证码)一、使用整合kaptcha方式实现验证码生成与验证二、使用hutool-captcha方式实现验证码生成与验证前言 在springboot的登陆...
      99+
      2024-04-02
    • vue表单验证rules及validator验证器的使用方法实例
      目录前言表单验证rules自定义校验规则总结前言 为防止用户犯错,尽可能更早地发现并纠正错误。 Element中Form (表单)组件提供了表单验证的功能,只需要通过 rules 属...
      99+
      2024-04-02
    • PHP 防抖技术:提升用户体验的重要利器
      摘要:在现代网页应用程序中,用户体验是至关重要的。而防抖技术是一种提升用户体验的重要利器,可以有效地减少不必要的请求和提高页面性能。本文将介绍PHP中的防抖技术,并给出几个具体的代码示例。正文:引言随着互联网的普及和发展,网页应用程序在我们...
      99+
      2023-10-21
      PHP 用户体验 防抖技术
    • ASP.NET生成验证码的方法
      本文实例为大家分享了ASP.NET生成验证码的具体代码,供大家参考,具体内容如下 首先,添加一个一般处理程序 注释很详细了,有不懂的欢迎评论 using System; u...
      99+
      2022-06-07
      net ASP.NET 方法 验证码 ASP
    • PHP验证码的调用方法
      这篇文章主要介绍“PHP验证码的调用方法”,在日常操作中,相信很多人在PHP验证码的调用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP验证码的调用方法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
      99+
      2023-06-17
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作