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

Função Anônima

campoFiltro.addEventListener("input", () => {...});

Porque isso não funciona?

8 respostas

Boa noite, Augusto! Como vai?

Qual log de erro que vc está tendo ao fazer esse tipo de código? Poderia colar aqui para eu dar uma olhada e tentar te ajudar?

Grande abraço e bons estudos, meu aluno!

Na verdade eu vi aqui e isso só acontece quando tento pegar o valor de this na função anônima dentro de addEventListener. Não ocorre erro, entretando this está indefinido.

Código: let campoFiltro = document.querySelector("#filtrar-tabela");

campoFiltro.addEventListener("input", () => { let valor = campoFiltro.value;

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

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

    let nome =  paciente.querySelector(".info-nome").textContent;

    if(!new RegExp(valor, "i").test(nome) && valor.length > 0) {
        paciente.classList.add("invisivel");
    } else {
        paciente.classList.remove("invisivel");
    }
}

});

solução!

Ah, agora entendi a sua dúvida! Isso acontence pq o this dentro de uma arrow function não funciona igual a um this de uma function comum!

Dá uma olhada nesse link da documentação das arrow functions! Ele deve te ajudar a entender melhor essa questão que acabei de te apresentar!

Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!

Também tive um problema parecido e acredito que seja por causa do contexto do "this".

Na parte de criar o código para filtrar a tabela, eu estava tentando utilizar o "this.value" dentro da função anonima que iterava na lista de pacientes com forEach, porém retornava sempre undefined mesmo que no if acima eu tinha acabado de usar o mesmo this.value para validar! Acredito que como cada iteração do forEach nada mais é do que uma chamada de função, o "this" tenha mudado de contexto para essa função chamada.

Me corrija se estiver errado, mas pareceu ser esse o caso hahaha

No código abaixo, o this utilizado para o new RegExp é undefined. Para poder continuar utilizando o forEach nesse trecho, utilizar o "event.target.value" é uma opção boa? :)

...
    if (this.value.length > 0) {
        listaPacientes.forEach(function (pacienteTR) {
            var nomePacienteLista = pacienteTR.querySelector(".info-nome").textContent;

            var expressaoRegular = new RegExp(this.value, "i");
        });
    }
...
})

Oi Eduardo tudo bem?

O this dentro do método forEach sempre aponta para o window (que é a página HTML) por isso tem que usar salvar o conteúdo numa variável e depois utilizar ele.

Espero ter ajudado!!

Boa noite, Eduardo! Como vai?

Em JavaScript é necessário muito cuidado com o uso do this!

No caso que vc citou, provavelmente vc estava dentro de um addEventListener(), correto? Se sim, então se vc tivesse utilizado uma arrow function para o forEach(), então as coisas teriam funcionado como vc imaginava!

<input id="nome" />
<script>
     const campoTexto = document.querySelector('#nome');
     campoTexto.addEventListener('input', function() {
          if (this.value.length > 0) {
               [1, 2, 3].forEach((item) => {
                    console.log(item); // Vai imprimir os valores do vetor.
                    console.log(this.value); // Vai imprimir o texto digitado no input.
               });
          }
     });
</script>

Agora, se vc usar arrow function também como callback do addEventListener(), novamente tudo deixa de funcionar!

<input id="nome" />
<script>
     const campoTexto = document.querySelector('#nome');
     campoTexto.addEventListener('input', (event) => {

          // Essa linha irá lançar o erro:
          // Uncaught TypeError: Cannot read property 'length' of undefined
          // Isso acontece porque nesse caso this representa o objeto Window!
          if (this.value.length > 0) {
               [1, 2, 3].forEach((item) => {
                    console.log(item);
                    console.log(this.value);
               });
          }
     });
</script>

Sendo assim, a conclusão é a seguinte: Quando utilizamos arrow functions o this irá representar o valor do contexto onde a arrow function foi declarada.

Agora, sobre o que vc falou em relação ao event.target, sim, essa seria uma boa abordagem para não se ter uma surpresa com um valor inesperado do this! O código ficaria assim:

<input id="nome" />
<script>
     const campoTexto = document.querySelector('#nome');
     campoTexto.addEventListener('input', (event) => {
          const elementoAlvo = event.target;
          if (elementoAlvo.value.length > 0) {
               [1, 2, 3].forEach((item) => {
                    console.log(item);
                    console.log(elementoAlvo.value); // Imprime os valores digitados no campo de texto.
               });
          }
     });
</script>

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos, meu aluno!

Oi Gabriel e André!

Acho que entendi sim, meio diferente de outras linguagens haha

Resta praticar agora! :D

Opa, Eduardo! É, o JavaScript tem umas coisas diferentes! Mas na realidade, todas as linguagens de programação tem suas peculiaridades, não é mesmo? hahahaha

Sempre que precisar de alguma ajuda ou tirar alguma dúvida é só mandar aqui no fórum da Alura!

Grande abraço e bons estudos, meu aluno!