我正在使用Angular CLI 9.0.7运行应用程序。在此应用程序中,存在一个带有字段的表格,需要对其控制数字进行验证。为此,我创建了一个自定义验证器。
更改表单上的字段时,将激活“自定义验证器”以检查一致性。
Custom Validator组件需要调用另一个类中的方法,该方法由其他组件共享,并且在执行此行时,我收到消息无法读取属性' isCpf '未定义。
我复制了自定义验证器中的内容,并通过了,但这不正确,很糟糕。
如何正确调用isCpf方法并遵循良好做法?
这是我的自定义验证器
static cpfValido(control: AbstractControl): any | null {
const cpf: string = control.value;
if (cpf === '') {
return null;
}
else {
if (this.isCpf(cpf)) { // When isCpf is called throw Cannot read property 'isCpf' of undefined
null;
}
else {
return { 'cpfValido': false };
}
}
}
在同一文件中,这是一个被称为方法
private static isCpf(pNumeroCpf: string): boolean {
if (!pNumeroCpf) return false;
let nro: string = this.preencherComCaracterEsquerda(this.removerFormatacao(pNumeroCpf), this.SIZE_CPF, '0');
let j: number = 0;
let peso: number = 2;
let soma: number = 0;
let dvc: number[] = [0, 0];
let dvi: number[] = [0, 0];
if (this.temCaracterRepetido(nro)) return false;
for (j = 0; j < 2; j++) {
peso = 2;
soma = this.aplicarPeso(nro.substring(0, nro.length - 2 + j), peso, 11);
dvc[j] = (soma % 11) < 2 ? 0 : 11 - (soma % 11);
}
dvi[0] = parseInt(nro.charAt(nro.length - 2), 10);
dvi[1] = parseInt(nro.charAt(nro.length - 1), 10);
return (dvi[0] === dvc[0] && dvi[1] === dvc[1]);
}
答案 0 :(得分:0)
静态成员由类名和其名称引用。有关更多信息,请参见here。
所以您的情况应该是
export class ValidatorClass {
static cpfValido(control: AbstractControl): any | null {
const cpf: string = control.value;
if (cpf === '') {
return null;
}
else {
if (ValidatorClass.isCpf(cpf)) { // <-- use class name instead of `this`
null;
}
else {
return { 'cpfValido': false };
}
}
}
.
.
}
我在这里假设您的班级名称为ValidatorClass
。请用您的实际班级名称替换它。
答案 1 :(得分:0)
问题是您试图在this
内调用static class
。你不能那样做。 static classes
应该是纯净的。
这是正在发生的事的一个例子:
class Person {
constructor(name) {
this.name = name;
}
static getName() {
return this.name;
}
getNameWorks() {
return this.name;
}
}
const person = new Person('Joe');
// Non static method
console.log(person.getNameWorks());
// Exception
console.log(person.getName());
您可以通过执行ClassName.method()
访问静态方法,但是请记住,您不能在this
内使用static classes
所以您可以改为执行以下操作:
class Person {
constructor() { }
static sayHello(text) {
alert(text);
}
}
Person.sayHello('hello');
话虽如此,看来您可以替换:
this.isCpf(cpf)
使用
WhateverTheClassNameIs.isCpf(cpf)