由于 CustomValidator 应用于非必需的表单字段,表单无效
Form INVALID due to CustomValidator applied on NON-required form field
我有这个表格:
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;
}
在 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
}
我有这个表格:
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;
}
在 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
}