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

Erro no GetDate

Segui o curso até aqui e tudo funcionando, com o DateHelper.js inclusive, mas na hora de implementar o view deu o seguinte erro:

DateHelper.js:8 Uncaught TypeError: Cannot read property 'getDate' of undefined
    at Function.dataParaTexto (DateHelper.js:8)
    at model.negociacoes.map.n (NegociacoesView.js:25)
    at Array.map (<anonymous>)
    at NegociacoesView._template (NegociacoesView.js:21)
    at NegociacoesView.update (NegociacoesView.js:42)
    at NegociacaoController.adiciona (NegociacaoController.js:18)
    at HTMLFormElement.onsubmit (index.html:14)

Revi todo o código e não consegui resolver. Conseguem me ajudar?

Seguem meus códigos:

NegociacoesView.js

class NegociacoesView {

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

    _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>
                    </t>
                `
            }).join('')}
        </tbody>

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

    }

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

DateHelper.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 yyy/mm/dd');

        return new Date(...texto.split('-').map((item,indice) => item - indice % 2));
    }

}

Se precisarem de algum outro, só falar.

Desde já, obrigado.

Abs.

6 respostas

Compartilhe o código do seu controller, inclusive da classe Negociacoes.

Compartilhe o código do seu controller, inclusive da classe Negociacoes.

Seguem os códigos, Flávio.

NegociacaoController.js:

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

        console.log(this._listaNegociacoes.negociacoes);
    }

    _criaNegociacao() {
        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();

    }

}

Negociacao.js:

class Negociacao {

    constructor(data,quantidade,valor) {
        this._data = new Date(data.getTime());
        this._quantidade = quantidade;
        this._valor = valor;
        Object.freeze(this);
    }

    get data (){
        return new Date(this._data.getTime());
    }

    get quantidade() {
        return this._quantidade;
    }

    get valor (){
        return this._valor;
    }

    get volume () {
        return this._quantidade * this._valor;
    }

}

ListaNegociacoes.js:

class ListaNegociacoes {

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

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

    get negociacoes() {
        return [].concat(this._negociacoes);
    }

}
solução!

Boa noite. Seu erro está nesta linha da classe do controller

 this._listaNegociacoes.adiciona(this._criaNegociacao);

Faltou invocar a função, ou seja, faltou o ().

Tudo certo?

Sim, Flávio. Obrigado.