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

Erro ao listar todos

Olá. Ao implementar o lista todos, passou a dar problema no meu DataHelper.js. O erro no console é:

Uncaught (in promise) TypeError: Cannot read property 'getDate' of undefined
    at Function.dataParaTexto (DateHelper.js:10)
    at NegociacoesView.js:25
    at Array.map (<anonymous>)
    at NegociacoesView.template (NegociacoesView.js:22)
    at NegociacoesView.update (View.js:14)
    at Bind.js:6
    at Proxy.<anonymous> (ProxyFactory.js:14)
    at NegociacaoController.js:27
    at Array.forEach (<anonymous>)
    at NegociacaoController.js:26

Segue meu controller:

class NegociacaoController {

    constructor() {

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

        this._inputData = $('#data');
        this._inputQuantidade = $('#quantidade');
        this._inputValor = $('#valor');

        this._listaNegociacoes = new Bind(
            new ListaNegociacoes(), 
            new NegociacoesView($('#negociacoesView')), 
            'adiciona', 'esvazia', 'ordena');

        this._mensagem = new Bind(
            new Mensagem(), new MensagemView($('#mensagemView')),
            'texto');

        ConnectionFactory
            .getConnection()
            .then(connection => {
                new NegociacaoDao(connection)
                    .listaTodos()
                        .then(negociacoes => {
                            negociacoes.forEach(negociacao => {
                                this._listaNegociacoes.adiciona(Negociacao);
                            });
                        });
            });
    }

    adiciona(event) {

        event.preventDefault();
        ConnectionFactory
            .getConnection()
            .then(connection => {

                let negociacao = this._criaNegociacao();

                new NegociacaoDao(connection)
                    .adicona(negociacao)
                        .then(() => {
                            this._listaNegociacoes.adiciona(negociacao);
                            this._mensagem.texto = 'Negociação adicionada com sucesso'; 
                            this._limpaFormulario();   
                        });
            })
            .catch(erro => this._mensagem.texto = erro);

    }

//outros métodos
}

Data Helper:

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

NegociacaoDao:

class NegociacaoDao {

    constructor (connection){

        this._connection = connection;
        this._store = 'negociacoes';
    }

    adicona(negociacao) {

        return new Promise((resolve, reject) => {
            let request = this._connection
                .transaction([this._store], 'readwrite')
                .objectStore(this._store)
                .add(negociacao);

            request.onsuccess = e => {
                resolve();
            }

            request.onerror = e => {
                console.log(e.target.error);
                reject('Não foi possível adicionar no DB a negociação!')
            }
        });
    }

    listaTodos() {

        return new Promise((resolve, reject) => {

            let cursor = this._connection
                .transaction([this._store], 'readwrite')
                .objectStore(this._store)
                .openCursor();

            let negociacoes = [];

            cursor.onsuccess = e => {
                let atual = e.target.result;
                if (atual) {
                    let dado = atual.value;
                    negociacoes.push(new NegociacaoDao(dado._data, dado._quantidade, dado._valor));
                    atual.continue();
                } else {
                    resolve(negociacoes);
                }
            };

            cursor.onerror = e => {
                console.log(e.target.error.name);

                reject("Não foi possível listar as negociações!");

            };
        });
    }
}
2 respostas

Boa tarde, Carlo! Como vai?

Vc poderia compartilhar seu projeto no github e mandar o link aqui? Assim eu poderei dar uma olhada no que está acontecendo pra tentar te ajudar!

Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!

solução!

Pessoal,

Descobri o erro. O autocomplete do VSCode me pregou uma peça...

ConnectionFactory
            .getConnection()
            .then(connection => {
                new NegociacaoDao(connection)
                    .listaTodos()
                        .then(negociacoes => {
                            negociacoes.forEach(negociacao => {
                                this._listaNegociacoes.adiciona(Negociacao);
                            });
                        });
            });

No caso, this._listaNegociacoes.adiciona(Negociacao) deve ser minusculo. O autocomplete colocou com maiusculo.

Valeu pessoal.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software