Angular 9 - Невозможно прочитать свойство undefined - PullRequest
0 голосов
/ 02 апреля 2020

Я запускаю приложение, используя Angular CLI 9.0.7. В этой заявке есть форма с полем, для которой необходимо проверить свой элемент управления git. Для этого я создал пользовательский валидатор.

Когда поле формы изменяется, пользовательский валидатор активируется для проверки согласованности.

Компонент пользовательского валидатора должен вызывать метод который находится в другом классе и является общим для других компонентов, и когда он собирается выполнить эту строку, я получаю сообщение Не удается прочитать свойство ' isCpf ' undefined.

Я скопировал то, что вызывается внутри пользовательского валидатора и передается, но это не правильно, это отстой.

Как я могу правильно вызвать метод 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]);
    }

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Проблема в том, что вы пытаетесь позвонить 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());

Вы можете получить доступ к методам stati c, выполнив ClassName.method(), но имейте в виду, что вы не можете использовать this в static classes

Таким образом, вы можете сделать что-то вроде этого:

class Person {
  constructor() { }
  static sayHello(text) {
    alert(text);
  }
}

Person.sayHello('hello');

С учетом вышесказанного выглядит, что вы можете просто заменить:

this.isCpf(cpf)

на

WhateverTheClassNameIs.isCpf(cpf)

0 голосов
/ 02 апреля 2020

Stati c члены ссылаются на имя класса, за которым следует их имя. См. здесь для получения дополнительной информации.

Так что в вашем случае это будет

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. Пожалуйста, замените его своим реальным именем класса.

...