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

Continua adicionando paciente

Continua adicionando paciente mesmo estando com peso ou altura errado, além disso está dando altura inválida no primeiro paciente, mesmo estando com menos de 3.

form.js
var botaoAdicionar = document.querySelector("#adicionar-paciente");

botaoAdicionar.addEventListener("click", function(event){
    event.preventDefault();
    var form = document.querySelector("#form-adiciona");

    var paciente = obtemPacienteDoFormulario(form);

    var pacienteTr = montaTr(paciente);

    if (!validaPaciente(paciente)) {
        console.log("paciente inválido!");
        return;
    }

    var tabela = document.querySelector("#tabela-pacientes");
    tabela.appendChild(pacienteTr);
    form.reset();
})

function obtemPacienteDoFormulario(form){
    var paciente = {
        nome: form.nome.value,
        peso: form.peso.value,
        altura: form.altura.value,
        gordura: form.gordura.value,
        imc: calculaImc(form.peso.value,form.altura.value)
    }
    return paciente;
}

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

    return pacienteTr;
}

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

    return td;
}

function validaPaciente(paciente) {
    if(validaPeso(paciente.peso)) {
        return true;
        }else {
            return false;
        }
}
calcula-ims.js
var titulo = document.querySelector(".titulo");
titulo.textContent = "Aparecida Nutricionista";

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 pesoValido = validaPeso(peso);
    var alturaValido = validaAltura(altura);

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

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

    if(!pesoValido){
        console.log("Peso inválido");
        pesoValido = false;
        tdImc.textContent = "Peso inválido";
        paciente.classList.add("paciente-invalido");
    }

    if(!alturaValido){
        console.log("Altura inválida");
        alturaValido = false;
        tdImc.textContent = "Altura inválida";
        paciente.classList.add("paciente-invalido");
    }

    if(alturaValido && pesoValido){
        var imc = calculaImc(peso,altura);
        tdImc.textContent = imc;
    }
}

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

    imc = peso / (altura * altura);

    return imc.toFixed(2);
}

function validaPeso() {
    if(peso >= 0 && peso <= 1000) {
        return true;
    }else {
        return false;
    }
}

function validaAltura() {
    if(altura >= 0 && altura <= 3.00) {
        return true;
    }else {
        return false;
    }
}
4 respostas

Oi, Alison, tudo bem?

Você poderia publicar o projeto completo no github, a presença do seu arquivo html ajuda a analisar o erro. :}

Olá Laís, tudo bem :) https://github.com/alisonrussi/JS_Alura?files=1 Primeira vez que upo um projeto pro Github, creio que esse seja o link.

Consegui resolver o problema de adicionar o paciente, vi que esqueci de escrever peso e altura nas functions validaPeso e validaAltura. Estava "function validaPeso()" e "function validaAltura()". O certo é "function validaPeso(peso)" e "function validaAltura(altura)". Mas ainda estou com o problema de dar o erro de Altura inválida no primeiro paciente da lista, não importa o valor de altura que eu coloque para ele.

solução!

Fala Alison, tudo beleza?

O seu erro está na ordem de declaração das suas variáveis.

Lembrando, o Javascript é uma linguagem interpretada, então o seu navegador passa da esquerda para direita, de cima para baixo, linha a linha interpretando seus comandos, dito isso, vamos ao problema.

Atualmente, seu código é:

   var alturaValido = validaAltura(altura);

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

Repare que você tenta validar uma variável altura que ainda não existe definida no seu código (só nas linhas abaixo), por isso o retorno sempre é false

Para corrigir o problema, basta reorganizar.

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

Veja como faz mais sentido, primeiro capturamos o elemento HTML que contém a informação que precisamos (querySelector), depois pegamos o dado, conteúdo de texto que está sendo armazenado por ele (textContent), para que só depois, com essa informação em mãos, consigamos realizar a validação.

Espero que tenha ficado claro.

Abraços!