在Angular2中验证反应形式字段的最佳方法是什么?

时间:2018-07-28 21:28:06

标签: javascript angular validation angular-reactive-forms custom-validators

我正在尝试验证Angular 2中的Reactive form字段。在这里,我编写了自定义验证器,我不确定这是否是正确的验证方法。但是,无论我如何无法通过代码获得准确的结果,某些测试用例均会失败。如果有人知道,请纠正代码和方法,如果不正确的话。

这些是我的条件,

    如果输入通配符,
  1. 文本字段应为4到14个字母数字。否则,它是7到25个字母数字。

    a。如果输入星号(*),则必须为最后一个字符,并且应为5到13个字母数字。

    b。如果输入问号(?),则可以在5到14之间(包括5和14)之间的任意位置。以下文字长度将被接受。

    i。 7

    ii.10

    iii.11

    iv。 13

    v。 14

    c。如果未输入通配符,则可以是7到25个字母数字s。

这是我的代码,我已经编写了自定义验证器。

static ProductTypeValidation(min: number, max: number): ValidatorFn {
  return (c: AbstractControl): { [key: string]: boolean } | null =>{
    if(c && (c.value !== '')){
      const s=c.value;
      var reg=/[^A-Za-z0-9]+/;
      var reg1=/[^A-Za-z0-9*?]+/;
      if(!s.match(reg)){
        if(s.length<7 || s.length>25){
          console.log('Invalid with size')
          return{
              'ProductTypeValidation': true
          };
        }
        else{
          console.log('valid with size');
          return null;
        }
      }else{
      if(s.match(reg1)){
        console.log('Main Error');
        return{
          'ProductTypeValidation': true
      };
      }else{
      for(let i=0;i<s.length && i<4;i++){
        if(s.charAt(i).match(reg)){
          console.log('Invalid first');
          return{
            'ProductTypeValidation': true
        };
        }else{
          console.log('valid');
          return null;
        }
      }
      if(s.length>4 && s.length < 14 ){
        for(let i=4;i<13;i++){
          if(s.charAt(i) == '*'){
            if(s.charAt(i+1) == ''){
              console.log('valid');
              return null;
            }else{
              console.log('Invalid *');
              return{
                'ProductTypeValidation': true
            };
            }
          }
        }
      }
      if(s.length>4 && s.length <15){
        for(let i=4;i<14;i++){
          if(s.charAt(i) == '?'){
            if(s.length == 7 || s.length == 10|| s.length == 11 || s.length == 13 || s.length ==14){
              console.log('valid');
              return null;
            }
            else{
              console.log('Invalid?');
              return{
                'ProductTypeValidation': true
            };
            }
          }
        }
      }
      for(let i=13;i<s.length && i<25;i++){
        if(s.charAt(i).match(reg)){
          console.log('Invalid remaining');
          return{
            'ProductTypeValidation': true
        };
        }else{
          console.log('valid');
          return null;
        }
      }
      
      }
    
      }

    }
     return null; 
  };
}

2 个答案:

答案 0 :(得分:2)

您应该在Form控制器中调用自定义验证程序,然后您的表单控制器会小心地在每次按键时调用您的方法。

'productType': new FormControl('', [CustomValidators.productTypeValidation(6,25)]);

答案 1 :(得分:0)

我已经完成了针对上述情况的“自定义验证器”的编写,但是当我从项目中调用它时,它仅对第一次按键有效,即使该功能可以在进行不同测试时为我提供正确的结果。谁能纠正我。

这是我更新的代码。

//Custom validator for Product type
static ProductTypeValidation(min: number, max: number): ValidatorFn {
  return (c: AbstractControl): { [key: string]: boolean } | null =>{
    if(c && (c.value !== '')){
    const s=c.value;
    var reg=/[^A-Za-z0-9]+/;
    var reg1=/[^A-Za-z0-9*?]+/;
    var reg2=/[^A-Za-z0-9*]+/;
    var reg3=/[^A-Za-z0-9?]+/;
    if(s.match(reg))
    {
      if(s.match(reg1))
      {
        console.log('Apart from special char existed')
        return{
          'ProductTypeValidation': true
        };
      }else{
            if(s.length < 4)
            {
                console.log('special char existed but length is minimum');
                return{
                  'ProductTypeValidation': true
                };
            }else{
                    if(s.charAt(0).match(reg) || s.charAt(1).match(reg) || s.charAt(2).match(reg) || s.charAt(3).match(reg))
                    {
                         console.log('first 4 positions it self special char existed');
                         return{
                          'ProductTypeValidation': true
                        };
                    }else{
                            if(s.length>4 && s.length<=14)
                            {
                                 if(s.match(reg2) && s.match(reg3))
                                 {
                                     let a=s.indexOf('*');
                                     let b=s.indexOf('?');
                                    if(b>a)
                                    {
                                        console.log('Invalid after * everything is invalid');
                                        return{
                                          'ProductTypeValidation': true
                                        };
                                    }else if((s.charAt(a+1) == '') && (s.length == 7 ||s.length == 10 || s.length == 11 ||s.length == 13 || s.length == 14) && (a<13))
                                    {
                                        
                                        console.log('valid with all conditions * and ?');
                                        return null;
                                    }else{
                                        console.log('Invalid ? and *');
                                        return{
                                          'ProductTypeValidation': true
                                        };
                                         }
                                 }
                                else if(s.match(reg2))
                                 {
                                     if(s.length == 7 || s.length ==10 || s.length == 11 || s.length == 13 || s.length == 14)
                                     {
                                         console.log('valid with ?');
                                         return null;
                                    }else{
                                     console.log('invalid with ?');
                                     return{
                                      'ProductTypeValidation': true
                                    };
                                    }
                                 }else{
                                    let a=s.indexOf('*');
                                    let b=s.indexOf('?');
                                    if(s.length>4 && s.length <14)
                                    {

                                    if(b>a)
                                    {
                                        console.log('Invalid after * everything is invalid');
                                        return{
                                          'ProductTypeValidation': true
                                        };
                                     }else if(s.charAt(a+1) == '')
                                     {
                                        console.log('vaid with *');
                                        return null;
                                    }else{
                                         console.log('Invalid with *');
                                         return{
                                          'ProductTypeValidation': true
                                        };
                                        }
                                    }else{
                                      console.log('* exceeded the size');
                                      return{
                                        'ProductTypeValidation': true
                                      };
                                    }
                                  }

            
                             }else{
                                    if(s.match(reg))
                                    {
                                    console.log('After 14 no special characters are allowed');
                                    return{
                                      'ProductTypeValidation': true
                                    };
                                    }else{
                                    console.log('it will return null');
                                    return null;
                                    }
  
                                }
                        }
                }
            }
      
    }else{
      if(s.length<7 || s.length>25){
        console.log('size not matched');
        return{
          'ProductTypeValidation': true
        };
      }else{
        console.log('Size matched');
        return null;
      }
    }
      
}
return null;

}
}