由于在非必填表单字段上应用了 CustomValidator,表单无效

Posted

技术标签:

【中文标题】由于在非必填表单字段上应用了 CustomValidator,表单无效【英文标题】:Form INVALID due to CustomValidator applied on NON-required form field 【发布时间】:2022-01-22 04:45:47 【问题描述】:

我有这个表格

    this.form = new FormGroup(
        someField: new FormControl(''),
        someOtherField: new FormControl(''),
        cpf: new FormControl('', [ CustomFormValidators.isValidCPF ]),
    );

还有这个CustomValidator:

    static isValidCPF(control: AbstractControl): ValidationErrors | null 
    
        const cpf: string = String(control.value);
        const validCPF = CustomFormValidators.sanitizeCPF(cpf);
    
        if ( CustomFormValidators.validateCPF( validCPF ) ) return null; //Success
            
        return  isValidCPF: true ; //Error
    

我的问题是:

在我的表单中,CPF 字段不是必需的,因此用户可以将其留空。 但是我的 CustomValidator 触发了错误,因此我的表单无效,并且 否则不会提交。

我尝试将这个条件放在方法上,但没有成功:

    if(!control.value)
            if(control.errors && !control.errors.hasOwnProperty('required'))
            return null;
        
    

附加信息:

下面的代码以防万一。但它没有损坏或错误。它可以 100% 完美运行。它可能在变量名上有拼写错误,因为我不得不改变这个问题。但下面的代码不是问题

    private static sanitizeCPF(cpf): string
        return cpf.replace(/[^\s\d\ ]*[\s]?[\s\\\^]?/g,'');
    
        
    private static validateCPF(cpf: string, verifier?): boolean 
        let sum = 0;
        let rest;
        const x = verifier ? 0 : 1;
    
        for (let i = 1; i <= (9 + x); i++)
            sum = sum + parseInt(cpf.substring(i-1, i)) * ((11 + x) - i);
        
        rest = (sum * 10) % 11;
    
        if ((rest == 10) || (rest == 11))  rest = 0; 
        if (rest != parseInt(cpf.substring((9 + x), (10 + x))) )  return false; 
    
        if(!verifier)  return CustomFormValidators.validateCPF(cpf, true); 
    
        return true;
    

【问题讨论】:

【参考方案1】:

在 Angular 中,通常不验证空输入 - 因为这是必需的验证器的工作。

输入为空时直接跳过验证:

static isValidCPF(control: AbstractControl): ValidationErrors | null 
     
  
    const cpf: string = String(control.value);
    // -------------
    if (!cpf) return null;
    // -------------
    const validCPF = CustomFormValidators.sanitizeCPF(cpf);

    if ( CustomFormValidators.validateCPF( validCPF ) ) return null; //Success
        
    return  isValidCPF: true ; //Error

【讨论】:

以上是关于由于在非必填表单字段上应用了 CustomValidator,表单无效的主要内容,如果未能解决你的问题,请参考以下文章

有啥软件能快速实现网页自动填表?

如果我们无法访问表单 html 文件,是不是有预填表单?

MVC4 JQuery validate 无法验证非必填字段

如何在javascript中验证之前修剪非必填字段

怎么能够批量自动提交网页登陆,自动填表输入?

是的,对非必填字段进行验证