Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
10
respostas

Boas praticas Javascript - Objeto paciente - outros usos

Boa tarde, na orientação foi criando um objeto para paciente que esta sendo extraído do form, seria possível criar o objeto paciente para extrair da tabela também? A titulo de substituir esse bloco de código:

var pacientes = document.querySelectorAll(".paciente");

for (var i = 0; i < pacientes.length; i++) {

    var paciente = pacientes[i];

    var tdPeso = paciente.querySelector(".info-peso");
    var peso = tdPeso.textContent;

    var tdAltura = paciente.querySelector(".info-altura");
    var altura = tdAltura.textContent;

    var tdImc = paciente.querySelector(".info-imc");
10 respostas

Oi Fernando, tudo bem? Seria possível sim e até encorajo você a realizar esse feito. É um ótimo desafio hein? Quer tentar e depois mostrar aqui o que conseguiu? Caso tenha problemas, manda pra gente que discutindo a gente chega em uma solução.

solução!

Bom, fiz alguns testes, não sei se é o melhor caminho, pois orientação a objetos me confunde um pouco.

Nessa solução, fiquei travado no imc, na realidade até tem solução, mas não era a ideal, pode me dar uma luz?

Desde já muito obrigado.

var pacientes = document.querySelectorAll('.paciente');

for (i=0; i<pacientes.length; i++){
    var paciente = pacientes[i];

function selecionaTdContent(query){
    var td = paciente.querySelector(query);
    return td.textContent;

};
var pacienteZ = {
    nome: selecionaTdContent('.info-nome'),
    peso:selecionaTdContent('.info-peso'),
    altura:selecionaTdContent('.info-altura'),
    gordura:selecionaTdContent('.info-gordura'),
    imc: #DÚVIDA#
};



}

function calculaImc(peso,altura){
    var imc = 0;
    imc = peso / (altura * altura);

    return imc.toFixed(2);
}

Oi Fernando, desculpa a demora. Acho que você começou bem sim. Pro IMC, você pode usar o que o objeto já tem, ou seja, suas propriedades. Veja como poderia ser feito:

var pacienteZ = {
    nome: selecionaTdContent('.info-nome'),
    peso: selecionaTdContent('.info-peso'),
    altura: selecionaTdContent('.info-altura'),
    gordura: selecionaTdContent('.info-gordura'),
    imc: (this.peso / (this.altura * this.altura)).toFixed(2)
};

O this, neste caso se refere ao próprio objeto, então você pode usar isso. O cálculo é feito diretamente. Porém, você pode precisar desse IMC em algum outro lugar. Então você pode simplesmente chamar a função mesmo.

var pacienteZ = {
    nome: selecionaTdContent('.info-nome'),
    peso: selecionaTdContent('.info-peso'),
    altura: selecionaTdContent('.info-altura'),
    gordura: selecionaTdContent('.info-gordura'),
    imc: calculaIMC(this.peso, this.altura)
};

O problema agora no seu código atual é: você tem uma declaração de função dentro de um laço. Isso não é bom, a função está sendo redefinida e chamada a cada redefinição a cada iteração do laço. Como você poderia resolver isso?

Pense um pouco, depois eu volto pra gente continuar a evoluir isso.

Dicas:

  • O ideal é que o laço execute a função várias vezes sem ser redefinida.
  • E se você criasse uma função que recebe o TR paciente e retornasse o objeto já criado. Não seria melhor? Como poderia resolver isso? - Observe que se fizer isso, no laço você precisaria executar apenas duas funções, uma que seleciona a tr paciente, e outra que cria o objeto paciente.

Boa tarde, demorei para ver e já surgiram outras mil duvidas, rs. Existe alguma forma mais rápida de tirar duvidas? emails, chat, whats etc?

Muito Obrigado.

Fernando, infelizmente só usamos emails em casos muito específicos e depende muito de quem está respondendo no caso eu..., a gente procura resolver por aqui mesmo por que fica compartilhado para outros alunos acompanharem. Você pode listar suas dúvidas aqui, e a gente vai resolvendo. Tá bem?

Vamos continuar por aqui mesmo, pelo menos por enquanto, lista suas dúvidas aqui.

Ok, vamos a uma duvida atual, eu quis tentar adicionar uma nova coluna na tabela com o texto 'Deletar'. Para os contatos já existentes na tabela, funciona perfeitamente, porém para os pacientes que adiciona via form, é criada a td, porém sem conteúdo algum. Segue código:

// remover-pacientes.js
var pacientes = document.querySelectorAll('.paciente');

pacientes.forEach(function(paciente){

    var novaTd = montaTd();
    paciente.appendChild(novaTd)


});



function montaTd(){
    var novaTd = document.createElement('td');
    novaTd.textContent = 'Deletar';
    novaTd.classList.add('deletar');

    return novaTd;
}



var deletas = document.querySelectorAll('.deletar');

for(var i = 0; i<deletas.length; i++){
     var deleta = deletas[i];
        deleta.addEventListener('dblclick',function(event){
            event.target.parentNode.remove();
        });




}
// form.js

function montaTr(paciente) {
    var pacienteTr = document.createElement("tr");
    pacienteTr.classList.add("paciente");

    pacienteTr.appendChild(montaTd(paciente.nome, "info-nome"));
    pacienteTr.appendChild(montaTd(paciente.peso, "info-peso"));
    pacienteTr.appendChild(montaTd(paciente.altura, "info-altura"));
    pacienteTr.appendChild(montaTd(paciente.gordura, "info-gordura"));
    pacienteTr.appendChild(montaTd(paciente.imc, "info-imc"));
    pacienteTr.appendChild(montaTd());


    return pacienteTr;
}

Fernando, pelo que eu vejo e lembro do projeto você tem uma função montaTr no form.js, e você definiu outra no remove-pacientes.js. Lembre-se que se duas funções tiverem o mesmo nome dentro do mesmo contexto, uma vai sobrescrever a outra. É o que está acontecendo de certa forma.

Neste caso, você não precisa criar uma nova função para criar uma td com a classe deletar e o texto deletar, você pode usar a função que você já tem no form.js que deve ser igual a essa abaixo:

function montaTd(dado, classe) {
    var td = document.createElement("td");
    td.classList.add(classe);
    td.textContent = dado;

    return td;
}

E onde você está montando a tr, em vez de chamar a função sem passar nada, você passa o texto e a classe:

pacienteTr.appendChild(montaTd("deletar", "deletar"));

Pra entender melhor: Você criou uma função que já existia e na execução provavelmente uma sobrescreveu a outra e a segunda, recebia argumentos, no caso o dado e a classe, e você executou a função sem passar essas informações, o que resultou em um td em branco e sem a classe. =)

Testa pra gente? Deu pra entender?

entendi, funcionou, fiz de umas três formas diferentes. Vou colocar as outras duvidas em outros tópicos para manter a organização.

Muito obrigado pela ajuda.

Opa, tudo bem, como preferir. Lembra apenas de marcar o tópico como resolvido no post que tirou sua dúvida, assim os outros alunos conseguem ver de longe se o problema foi resolvido ou não.

Ok, irei fazer, obrigado novamente.