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

Problema ao gerar a tabela com as informações da Negociação

Uncaught TypeError: Cannot read property 'getDate' of undefined DateHelper.js:18 at Function.dataParaTexto (DateHelper.js:8) at NegociacoesView.js:31 at Array.map () at NegociacoesView._template (NegociacoesView.js:27) at NegociacoesView.update (NegociacoesView.js:11) at NegociacaoController.adiciona (NegociacaoController.js:18) at HTMLFormElement.onsubmit (index.html:14)

Esse é o erro que o console do meu navegador exibe.

class NegociacoesView {

    constructor(elemento) {

        this._elemento = elemento;
    }

    update(model) {

        // O innerHTML será esta convertendo as strings do template() em elementos do DOM.
        this._elemento.innerHTML = this._template(model);
    }
    _template(model) {

        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>
                ${model.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>`;
    }
}
8 respostas

Segue código da Classe Date Helper.js

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));
    }

}

Agradeço a ajuda desde já.

Olá Henrique,

Acredito que o problema esteja na sua model ListaNegociacoes, mais especificamente na declaração do array de negociações.

A declaração dele deve ser conforme código abaixo:

this._negociacoes = [];

No vídeo, o instrutor declara com { } e depois muda, mas quase não da pra perceber.

Espero ter ajudado. Abraço!

Oi Vinícius obrigado pela resposta, mas essa declaração no construtor da Classe ListaNegociacoes, esta correta, dessa mesma maneira que você exemplificou.

class ListaNegociacoes {

    constructor() {
        this._negociacoes = [];
    }

    adiciona(negociacao) {
        this._negociacoes.push(negociacao);
    }

    get negociacoes() {
        // Passando uma cópia da lista
        // Ao passarmos o this._negociacoes dentro do concat(), o retorno será uma nova lista, um novo array. 
        return [].concat(this._negociacoes);
    }
}

Consegue postar o seu controller?

Segue

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($('#negociacoesView'));
        this._negociacoesView.update(this._listaNegociacoes);
    }

    adiciona(event) {

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

    _criaNegociacao() {

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

    _limpaFormulario() {

        this._inputData.value = '';
        this._inputQuantidade.value = 1;
        this._inputValor.value = 0;
        this._inputData.focus();
    }
}
solução!

Henrique,

O problema está no Controller mesmo.

Está faltando ( ) na linha 17:

 this._listaNegociacoes.adiciona(this._criaNegociacao());    

Veja se resolve.

Abraço.

O erro na minha cara e eu não percebi, Vinícius muito obrigado, já estava arrancando os cabelos. haaha

hahahahah

Faz parte!

Abraço!