zoukankan      html  css  js  c++  java
  • Angular自定义异步验证器

    对名称进行重名异步判断
    <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'}); // 失去焦点时验证
    
  • 相关阅读:
    sdibt 1251 进化树问题
    hdu 2014 位运算
    poj 3254 状态压缩dp
    hdu 5040bfs+优先队列 需要存状态
    zoj 3812 状压dp
    C++标准库:bitset 用法整理&&zoj 3812
    BZOJ 2572 高速公路
    BZOJ 1036 树的统计
    BZOJ 1035 Risk
    BZOJ 1034 泡泡堂
  • 原文地址:https://www.cnblogs.com/chenfengami/p/12783668.html
Copyright © 2011-2022 走看看