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

Cannot read property 'getDate' of undefined

Bom dia, eu estou com o seguinte erro no console:

DateHelper.js:8 Uncaught TypeError: Cannot read property 'getDate' of undefined
    at Function.dataParaTexto (DateHelper.js:8)
    at modelo.negociacoes.map.n (NegociacoesView.js:23)
    at Array.map (<anonymous>)
    at NegociacoesView._template (NegociacoesView.js:20)
    at NegociacoesView.update (NegociacoesView.js:39)
    at NegociacaoController.adiciona (NegociacaoController.js:19)
    at HTMLFormElement.onsubmit (index.html:14)

Segue as classes que o console está identificando o problema:

class NegociacaoController{

    constructor(){

        let $ = document.querySelector.bind(document);

        this._inputData = $('#data');
        this._inputQuantidade = $('#quantidade');
        this._inputValor = $('#valor');
        this._listaNegociacoes = new ListaNegociacoes();
        this._negociacoesView = new NegociacoesView($('#negocieacoesView'));

        this._negociacoesView.update(this._listaNegociacoes);
    }

    adiciona(event){
        event.preventDefault();
        this._listaNegociacoes.adiciona(this._CriaNegociacao());
        this._negociacoesView.update(this._listaNegociacoes);
        this._limpaFormulario();
    }

    _CriaNegociacao(){
        return new NegociacaoController(DateHelper.textoParaData(this._inputData.value),
        this._inputQuantidade.value,
        this._inputValor.value);
    }

    _limpaFormulario(){
        this._inputData.value = '';
        this._inputQuantidade.value = 1;
        this._inputValor.value = 0.0;
        this._inputData.focus();
    }
}
class NegociacoesView{

    constructor(elemento){
        this._elemento = elemento;
    }

    _template(modelo){
        return `
        <table class="table table-hover table-bordered">
            <thead>
                <tr>
                    <th>DATA</th>
                    <th>QUANTIDADE</th>
                    <th>VALOR</th>
                    <th>VOLUME</th>
                </tr>
            </thead>

            <tbody>
                ${modelo.negociacoes.map(n => {
                    return `
                        <tr>
                            <td>${DateHelper.dataParaTexto(n.data)}</td>
                            <td>${n.quantidade}</td>
                            <td>${n.valor}</td>
                            <td>${n.volume}</td>
                        </tr>
                    `
                }).join('')}
            </tbody>

            <tfoot>
            </tfoot>
        </table>
        `;
    }

    update(modelo){
        this._elemento.innerHTML = this._template(modelo);
    }

}
class DateHelper {

    constructor(){
        throw new Error('Esta classe não pode ser instanciada')
    }

    static dataParaTexto(data){
        return `${data.getDate()}/${data.getMonth()+1}/${data.getFullYear()}`;
    }

    static textoParaData(texto){

        if(!/\d{4}-\d{2}-\d{2}/.test(texto)){
            throw new Error('Deve estar no formato aaaa-mm-dd');
        }
       return new Date(...texto.split('-').map((item, indice) => item - indice % 2));
    }
}

Alguém poderia me ajudar?

4 respostas

Fala Eduardo,

Você já debuggou para verificar se o parâmetro de data está indo corretamente para a função DataParaTexto?

Pois o erro indica que o n.data está vazio.

Fala ai Eduardo, dentro da função dateParaTexto, faça o log da data, veja o que esta chegando para a função.

solução!

Boa tarde meu aluno. Encontrei dois pontos de destaque no seu código. Vejamos:

_CriaNegociacao(){
        return new NegociacaoController(DateHelper.textoParaData(this._inputData.value),
        this._inputQuantidade.value,
        this._inputValor.value);
    }

Primeiro, o seu método esta começando com letra maiúscula, e isso quebra a convenção amplamente difundida pelos programadores. Mas isso não é a causa do seu erro. A causa é essa instrução:

    return new NegociacaoController(DateHelper.textoParaData(this._inputData.value),
        this._inputQuantidade.value,
        this._inputValor.value);
    }

Você esta retornando uma instância de NegociacaoController, quando na verdade você quer criar uma instância da classe Negociacao. Consegue enxergar?

Gente depois de longas horas eu e um amigo descobrimos o erro, estava na classe NegociacoesController, na função _CriaNegociacao() estava retornando um "new NegociacaoController" em vez de retornar "new Negociacao". Obrigado por qm veio ajudar =)

@edit1

Só agora que vi professor, obrigado! Vou fazer os ajustes =D