Angular 9-无法读取未定义的属性

我正在使用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]);
    }

totomy 回答:Angular 9-无法读取未定义的属性

静态成员由类名和其名称引用。有关更多信息,请参见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。请用您的实际班级名称替换它。

,

问题是您试图在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)

本文链接:https://www.f2er.com/2532105.html

大家都在问