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

Solução diferente do instrutor, é válida?

Oi pessoal, tudo bem? Utilizei uma solução um pouco diferente da do instrutor Flávio, gostaria de saber se ela também é válida/usual?

Minha solução Tenho a seguinte classe (view):

class NegociacoesView {

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

    _template(modelo) {

        let template = '';

        modelo.negociacoes.forEach(n => {
            template +=
                `<tr>
                    <td>${DataHelper.dataParaTexto(n.data)}</td>
                    <td>${n.quantidade}</td>
                    <td>${n.valor}</td>
                    <td>${n.volume}</td>
                </tr>`;
        });

        return template;

    }

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

}

e a tabela no index.html:

    <table class="table table-hover table-bordered">
        <thead>
            <tr>
                <th>DATA</th>
                <th>QUANTIDADE</th>
                <th>VALOR</th>
                <th>VOLUME</th>
            </tr>
        </thead>

        <tbody id="negociacoes-view">

        </tbody>

        <tfoot>
        </tfoot>
    </table>

Solução do instrutor Flávio no curso classe (view):

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>${DataHelper.dataParaTexto(n.data)}</td>
                    <td>${n.quantidade}</td>
                    <td>${n.valor}</td>
                    <td>${n.volume}</td>
                </tr>
                `
                }).join('')}
            </tbody>

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

    }

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

}

Div no index.html:

<div id="negociacoes-view"></div>
3 respostas
solução!

Sua solução tem um ponto positivo, que é renderizar apenas o miolo da tabela. Porém, para construir o template você usou um forEach, iterando em cada item e acumulando o resultado em uma variável. O map é muito mais semântico e eficaz, pois com ele você não precisa guardar o estado da variável template. Usando o forEach para a finalidade de converter cada item em uma tr é uma abordagem procedural.

Então, para ficar o melhor dos dois mundos, que tal atualizar apenas o miolo da tabela, mas mantendo o Array.map?

Sobre o código que você postou sobre minha solução, é o código não simplificado, usando blocos das arrow functions. Não sei se chegou na parte de simplificação, esta aqui https://cursos.alura.com.br/course/javascript-es6-orientacao-a-objetos-parte-1/task/16565

Perfeito! Mais do que esclarecido, cheguei na parte do código enxugado agora.

No final, ficou assim:

class NegociacoesView {

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

    _template(modelo) {

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

    }

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

}

Perfeito!!! Bora continuar que além desse curso há mais dois módulos e depois um de javascript funcional!

Sucesso e bom estudo!