Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Não consegui pegar a data de negociacao, ela parece estar "privada"

Com o código:

class NegociacaoController {

  constructor(){

    let $ = document.querySelector.bind(document);
    this._inputData = $('#data');
    this._inputQuantidade = $('#quantidade');
    this._inputValor = $('#valor');

  }

  adiciona(event){

    event.preventDefault();

    let data = new Date(
      ...this._inputData.value
        .split('-')
        .map((item, indice) => item - indice % 2)
    );

    let negociacao = new Negociacao(
      data,
      this._inputQuantidade.value,
      this._inputValor.value
    );
    console.log(negociacao);
    let dataFormatada = negociacao.data.getDate()
      + '/' + (negociacao.data.getMonth() + 1)
      + '/' + negociacao.data.getFullYear();
      console.log(dataFormatada);

  }
}

O console apresenta o erro "Cannot read property 'getDate' of undefined", ou seja o método getDate() está apontando para um objeto undefined, quando dei uma log para negociacao percebi que o atributo de data está como _data

Mudando para:

class NegociacaoController {

  constructor(){

    let $ = document.querySelector.bind(document);
    this._inputData = $('#data');
    this._inputQuantidade = $('#quantidade');
    this._inputValor = $('#valor');

  }

  adiciona(event){

    event.preventDefault();

    let data = new Date(
      ...this._inputData.value
        .split('-')
        .map((item, indice) => item - indice % 2)
    );

    let negociacao = new Negociacao(
      data,
      this._inputQuantidade.value,
      this._inputValor.value
    );
    console.log(negociacao);
    let dataFormatada = negociacao._data.getDate()
      + '/' + (negociacao._data.getMonth() + 1)
      + '/' + negociacao._data.getFullYear();
      console.log(dataFormatada);

  }
}

Funcionou corretamente, o que há de errado com meu código?

7 respostas

Não sei se entendi bem. Mas entendi que você queria saber a diferença entre os dois códigos:

Primeiro código:

let dataFormatada = negociacao.data.getDate()
      + '/' + (negociacao.data.getMonth() + 1)
      + '/' + negociacao.data.getFullYear();
      console.log(dataFormatada);

Segundo código:

let dataFormatada = negociacao._data.getDate()
      + '/' + (negociacao._data.getMonth() + 1)
      + '/' + negociacao._data.getFullYear();
      console.log(dataFormatada);

Ou seja, no primeiro código você está usando "negociacao.data" e no segundo está usando "negociacao._data". A diferença esta no underline.

É isso que você queria saber?

Na aula, o primeiro código

let dataFormatada = negociacao.data.getDate()
      + '/' + (negociacao.data.getMonth() + 1)
      + '/' + negociacao.data.getFullYear();
      console.log(dataFormatada);

funciona, no meu caso ele não está funcionando, tive que mudar para o segundo, queria saber o porquê disso acontecer.

solução!

Creio que você tenha esquecido de definir um método get para a data em negociação.

Como boa prática, defini-se um atributo privado em JS com _ (underscore) na frente como '_data' e espera-se que o programador entenda que ele não deve ser alterado abertamente.

Portanto, deve-se definir métodos públicos para operar sobre ele, como um getData().

getData(){
    return new Date(); // retorno de exemplo
}

Porém, em ECMAScript 6 (es6) é possível fazer da seguinte forma para definir um método get:

get data(){
    return new Date(); // retorno de exemplo
}

Dessa forma será possível acessar como :

negociacao.data

Bom estudo!

Hiogo, compartilha o código da sua classe Negociacao. No aguardo.

Como o Caio disse, o erro era no getter, obrigado!

Excelente, talvez você tenha criado começando com maiúscula.

Sucesso e bom estudo meu aluno!

Olá, eu tive o mesmo problema do Hiogo , inclusive minha classe Negociacao tinha o método getData() dessa forma, mas o código só funcionou quando eu alterei a classe Negociacao para get data(), ok?