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

Como criar a mesma solução no modo MVC?

Olá! Consegui criar o exercício com a mesma solução do instrutor, apenas em um index.html. Porém, estou tentando colocar no modo MVC e fiquei com algumas dúvidas.

Sem modo MVC:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>

    <div id="listaFuncionarios"></div>

    <script>
        let funcionarios = [
            {
                "nome": "Douglas",
                "endereco" : "Rua da esquina, 123",
                "salario" : "4500"
            },
            {
                "nome": "Felipe",
                "endereco" : "Rua da virada, 456",
                "salario" : "5000"
            },
            {
                "nome": "Silvio",
                "endereco" : "Rua da aresta, 789",
                "salario" : "6000"
            }
        ];

        let template = 
        `
        <table>
            <thead>
                <tr>
                    <th>Nome</th>
                    <th>Endereço</th>
                    <th>Salário</th>
                </tr>
            </thead>

            <tbody>
                ${funcionarios.map( lista => `
                    <tr>
                        <td>${lista.nome}</td>
                        <td>${lista.endereco}</td>
                        <td>${lista.salario}</td>
                    </tr>
                `).join('')}                      
            <tbody>
        </table>
        `;

        let $ = document.querySelector.bind(document);
        $('#listaFuncionarios').innerHTML = template;

    </script>
</body>
</html>

Com modo MVC:

Criei a seguinte arquitetura de pastas:

  • js/app/
     controllers/FuncionariosController.js    
     models/FuncionariosModel.js
     views/FuncionariosView

Códigos:

//index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>

    <div id="listaFuncionarios"></div>

    <script src="js/app/models/FuncionariosModel.js"></script>
    <script src="js/app//views/FuncionariosView.js"></script>
    <script src="js/app/controllers/FuncionariosController.js"></script>

    <script>

        let funcionariosController = new FuncionarioController();

    </script>
</body>
</html>

No Models:

//FuncionariosModel.js

class FuncionariosModel {

    constructor( nome, endereco, salario ){

        this._nome = nome;
        this._endereco = endereco;
        this._salario = salario;


    }

    get listaFuncionarios() {
        let funcionarios = [
            {
                "nome": "Douglas",
                "endereco" : "Rua da esquina, 123",
                "salario" : "4500"
            },
            {
                "nome": "Felipe",
                "endereco" : "Rua da virada, 456",
                "salario" : "5000"
            },
            {
                "nome": "Silvio",
                "endereco" : "Rua da aresta, 789",
                "salario" : "6000"
            }
        ];
    }


}

Na View:

class FuncionariosView {

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

    _template( model ){
        `
        <table>
            <thead>
                <tr>
                    <th>Nome</th>
                    <th>Endereço</th>
                    <th>Salário</th>
                </tr>
            </thead>

            <tbody>
                ${model.funcionarios.map( lista => `
                    <tr>
                        <td>${lista.nome}</td>
                        <td>${lista.endereco}</td>
                        <td>${lista.salario}</td>
                    </tr>
                `).join('')};                        
            <tbody>
        </table>

        `
    }

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

}

No Controller:

class FuncionarioController {

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

        this._funcionariosModel = new FuncionariosModel();
        this._funcionariosView = new FuncionariosView($('#listaFuncionarios'));

    }
}

Fiquei perdida na parte do controller. Ainda não consegui fazer aparecer no index.html a lista de funcionários. Poderia me dar uma dica, por favor, ou apontar onde estou errando? Seria algum método que está faltando no controller?

2 respostas

Boa noite, Henrique! Como vai?

Me parece que ficaram faltando algumas coisas, as quais irei listar abaixo.

  • Dentro do método _template( model ) vc precisa retornar o template pra que ele seja atribuído ao innerHTML em this._elemento.innerHTML = this._template(model).
  • Veja que a classe FuncionariosModel tem o método getter listaFuncionarios() e que dentro do método _template(model) na classe FuncionariosView vc faz model.funcionarios.map(). Esse map() não irá funcionar pois não há um atributo funcionarios no model. Vc precisará fazer model.listaFuncionarios.map().
  • Dentro do método listaFuncionarios() é preciso retornar a lista de funcionários.
  • Como último passo do construtor da classe FuncionarioController vc deve invocar o método lista(model) da classe FuncionariosView fazendo this._funcionariosView.lista( _funcionariosModel ).

Acho que com essas correções o seu código irá funcionar como esperado.

Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!

solução!

Boa noite Gabriel!

Muito obrigada pela dica, consegui aqui!

Fiquei apenas com dúvida nesta linha: this._funcionariosView.lista(this._funcionariosModel);

Poderia me explicar melhor o que ela faz? No caso seria como se a classe FuncionariosView no método lista, recebesse como parâmetro a classe FuncionariosModel ? Sem isso, não existiria está ligação/ponte entre o model e a view? Seria isso?

A forma como criei o model, view e controller, deixando o template na View, no Model, a lista de funcionários, e no controller trazendo está ponte entre View e Model, está correto? Consegui entender bem o modelo MVC?

Obrigada mais uma vez! =)

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