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

Objeto model está undefined.

Olá estou seguindo os procedimentos da video aula, e estou com esse problema: ao tentar acessar alguma propriedade da variavel model na NegociacaoView é apresentado que os atributos estão undefined:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Segue código do projeto:

index.html

`

<h1 class="text-center">Negociações</h1>

<form class="form" onsubmit="negociacaoController.adiciona(event)">

    <div class="form-group">
        <label for="data">Data</label>
        <input type="date" id="data" class="form-control" required autofocus/>        
    </div>    

    <div class="form-group">
        <label for="quantidade">Quantidade</label>
        <input type="number" min="1" step="1" id="quantidade" class="form-control" value="1" required/>
    </div>

    <div class="form-group">
        <label for="valor">Valor</label>
        <input id="valor" type="number" class="form-control"  min="0.01" step="0.01" value="0.0" required />
    </div>

    <button class="btn btn-primary" type="submit">Incluir</button>
</form>

<div class="text-center">
    <button class="btn btn-primary text-center" type="button">
        Importar Negociações
    </button>
    <button class="btn btn-primary text-center" type="button">
        Apagar
    </button>
</div> 
<br>
<br>

<div id="negociacoes-view"></div>

NegociacaoController.js 

class NegociacaoController {

constructor() {
    let $ = document.querySelector.bind(document);
    this._quantidade = $("#quantidade");
    this._data = $("#data");
    this._valor = $("#valor");
    this._listaNegociacoes = new ListaNegociacoes();

    this._negociacoesView = new NegociacoesView($("#negociacoes-view"));
    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._data.value),
                this._quantidade.value,
                this._valor.value
    );
}

_limpaFormulario() {
    this._data.value = '';
    this._quantidade.value = 1;
    this._valor.value = 0.0;

    this._data.focus();
}

}

NegociacaoView.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>
                ${
                    console.log(`data: ${model.negociacoes.data}
                                 quantidade: ${model.negociacoes.quantidade}
                                 valor:  ${model.negociacoes.valor}`)
                }
            </tbody>

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

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

`

4 respostas

Continuação do codigo:

DateHelper:

class DateHelper {

    constructor() {
        throw new Error('Está 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("Data invalida - A data deve seguir o formato: aaaa-mm-dd");

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

ListaNegociacao:

class ListaNegociacoes {

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

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

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

}

Negociacao:

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

Fazendo mais alguns testes a minha tabela aparece com os valores todos como undefined:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

solução!

Consegui achar a solução eu estava chamando o metodo this._criaNegociacao sem os (), foi somente adicionar os () que o projeto executou certinho:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Oi Roni, tudo bem?

Que bom que encontrou a solução e muito obrigada por compartilhar com a gente. Irei finalizar o tópico pra você.

Um abraço e bons estudos.

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