Angular自定义异步验证器

   2023-02-08 学习力0
核心提示:对名称进行重名异步判断form nz-form [formGroup]="form"pspan class="group-name-control" nz-form-controlinputnz-input placeholder="标签组名称"type="text"maxlength="15"formControlName="groupName"span class="lim
对名称进行重名异步判断
<form nz-form [formGroup]="form">
    <p>
        <span class="group-name-control" nz-form-control>
    	    <input 
                 nz-input
                 placeholder="标签组名称" 
                 type="text" 
                 maxlength="15" 
                 formControlName="groupName">
            <span class="limit">{{ getFormControl('groupName').value.length }}/15</span>
        </span>
        <span  class="error pd-l-10" 
                     *ngIf="getFormControl('groupName').dirty
                                  && !getFormControl('groupName').valid 
                                  && getFormControl('groupName').errors?.required">
    	    请输入标签组名称
        </span>
        <span class="error pd-l-10" 
            *ngIf="getFormControl('groupName').dirty
                         && !getFormControl('groupName').valid
                         && getFormControl('groupName').errors?.type === 'repeat'">
            {{ getFormControl('groupName').errors.errMsg }}
        </span>
    </p>
</form>  
    import {
        FormGroup,
        Validators,
        AbstractControl,
        ValidationErrors,
        AsyncValidatorFn
    } from '@angular/forms';

    this.form = this.fb.group({
        groupName:  ['', { Validators:[Validators.required, Validators.maxLength(15)], 
                     	        updateOn:  'blur' }],
     });

     this.form.controls['groupName'].setAsyncValidators(this.groupNameValidator(true, tag_group_name));


  /**
   * @desc 异步验证组名是否重复
   * @param {boolean} edit
   * @param {string} [groupName] - 组名
   */
  public groupNameValidator(edit: boolean, groupName?: string): AsyncValidatorFn {
    return async (control: AbstractControl): Promise<ValidationErrors | null> => {
      const value = control.value;
      if (!value) {
        return {
          valid: false,
          required: true
        };
      } else if (edit && value === groupName) {
        return null;
      } else {
        return this.updateTagsGroupService.checkGroupName(value)
        .toPromise()
        .then((res: object) => {
          const { status } = <any> res;
          if (status === 1) {
            return Promise.resolve({
              valid: false,
              type: 'repeat',
              errMsg: '标签组名称重复,请重新输入'
            });
          }
          return null;
        });
      }
    };
  }

//


性能上的注意事项

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

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

new FormControl('', {updateOn: 'blur'}); // 失去焦点时验证
 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • Angular.js的作用域和数据绑定
    初识Angular.js通过初识Angular.js可以做一个简单的入门,下面开始做深入的了解吧。作用域作用域($scope)和应用的数据模型相关联的,同时作用域也是表达式执行的上下文。$scope对象是定义应用业务逻辑、控制器方法和视图属性的地方。 作用域是视图和控制器
    03-16
  • Angular 4 设置组件样式的几种方式
    Angular 4 设置组件样式的几种方式
      你用Angular吗?一.介绍  如何只改动最简单的css代码,呈现完全不一样的视图效果。第一种:最基本的设置:  图1 代码 图2 界面运行效果图平常,想给一个label或者p等标签添加样式,我们就是这样操作,在Angular中也是一样的。现在,如果我想要将字体换
    03-16
  • angularJSapi学习-angular.copy使用
    angular.copy使用效果:初始状态:输入信息后未保存状态:点击save后状态:当输入框内容和master内容不一致时:点击reset使得user的信息被重置为master中信息: 具体代码: 1 !DOCTYPE HTML 2 html ng-app="app" 3 headscript src="./angular.min.js"/script
    03-16
  • Ionic启动时提示:The Angular CLI requires a minimum Node.js version of eithor v10.13 or v12.0
    Ionic启动时提示:The Angular CLI requires a m
    在新建ionic项目后通过ionic serve 启动ionic项目时提示:The Angular CLI requires a minimum Node.js version of eithor v10.13 or v12.0  注:博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号霸道的程序猿获取编程相关电子书、教程推送与
    03-16
  • Angular.js之内置过滤器学习笔记 javascript过
    !DOCTYPE htmlhtml lang="en"headmeta charset="UTF-8"titleangularFilter/titlescript src="http://cdn.bootcss.com/angular.js/1.4.6/angular.js"/script/head  body ng-app="angularJS" ng-controller="ctrl"    div{{
    03-08
  • Angular 隨記
    Windows下更新Node 和NPM方法管理員模式打開powershell執行以下命令:Set-ExecutionPolicy Unrestricted -Scope CurrentUser -Forcenpm install -g npm-windows-upgradenpm-windows-upgrade
    03-08
  • 双向数据绑定(angular,vue) 双向数据绑定指令
    最近github上插件项目更新了关于双向数据绑定的实现方式,关于angular和vue.angular众所周知是使用的脏检查($dirty)。一开始大家会认为angular开启了类似setInterval去不停的循环检查,性能极差,但其实并不是,$dirty是在一定条件下才会去执行,比如输入框
    03-08
  • 六、angular 生成二维码
    六、angular 生成二维码
    首先需要安装angular-qrcode :bower install monospaced/angular-qrcodenpm install angular-qrcode如何使用?在相应的需要使用二维码的页面增加如下代码:注意:这里的“version”和"size"可以根据github上面找出自己想要的结果:生成含有图片的二维码:这里
    03-08
  • angular.js简单入门。 angular入门教程
    angular.js简单入门。 angular入门教程
    小弟刚接触angular js  就写了一个简单的入门。后续慢慢补。。。首先看 html 页面。htmlmeta charset="UTF-8"headtitleangularJS/title/headscript type="text/javascript" src="./js/angular.min.js"/script      //引入 angularJSscript type="text/
    03-08
点击排行