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

Dúvida com atualizaDados na chamada do removeItem

Estou tentando entender o funcionamento do Jquery observando o código. Vi que tem uma chamada do AtualizaDados em dois lugares, um dentro da função de remover Item e outro na função após inicializado.

Entendo que ao clicar no botão para remover o item, o script vai executar a função aposInicializado, que vai identficar que foi clicado um objeto class="remover-item". Dai ele vai executar o método, correto? Dentro do método removeItem, vai fazer as ações necessárias e na ultima linha vai chamar o método atualizaDados. Mas depois o método aposInicializado, que chamou o removeItem, tem mais uma vez o método atualizaDados. Retirei a chamada do método removeItem, por que pensei que pela sequência que era chamado, não precisava duas vezes, mas não funcionou. Por que isto ocorre?

<script>
    var atualizaDados = function(){
        var items = $(".item-total");
            var total = 0;
            for(var i=0; i < items.length; i++) {
                    var conteudo = $(items[i]).text();
                    var preco = parseFloat(conteudo);
                    total += preco;
                }
            $("#valor-total").text(total);
            $("#quantidade-de-itens").text(items.length);
    };

    var removeItem = function(event) { 
        event.preventDefault();

        var self = $(this); 
        self.closest("tr").remove(); 
        atualizaDados();
    };

    var aposInicializado = function() {

            $(".remove-item").click(removeItem);
            atualizaDados();
        };

        $(aposInicializado);
</script>
5 respostas

O aposInicializado é executado na inicialização da página, para ser mais exato, após ela ter seus elementos carregados. No aposInicializado, a função removeItem não é executada, ela é adicionada ao evento click do $(".remove-item") e na sequência o atualizaDados é executado. Ao clicar no $(".remove-item") a linha que ele se encontra é removida e o atualizaDados é executado novamente.

Diego, obrigado pela resposta. A minha dúvida é que o método atualizaDados está sendo chamado dentro do removeItem e também dentro do aposInicializado.

Eu debuguei o código, ele chama o aposInicializado ao clicar no botão para remover. Veja no código abaixo que comentei as chamadas do atualizaDados(); com : chamada1 e chamada2.

Veja a função abaixo:

var aposInicializado = function() {

$(".remove-item").click(removeItem); atualizaDados(); // chamada1 };

var removeItem = function(event) { event.preventDefault();

var self = $(this); self.closest("tr").remove(); atualizaDados(); // chamada2 };

Se tirar a chamada de atualizaDados() do removeItem acima, ele não funciona a atualização dos valores. Eu queria entender por que ele não chama o atualizaDados(); que está no método aposInicializado, sendo que ele está logo após executar o removeItem.

Obrigado , André.

André,

O aposInicializado é executado somente uma vez, no final do script, na linha:

$(aposInicializado);

Por isso removendo a chamada do atualizaDados() do removeItem a atualização dos valores não funciona, pois o aposInicializado é chamado apenas uma vez, conforme descrevi acima.

Caso ainda não concorde comigo, você disse que debugou e a chamada do aposInicializado ocorre também no clique do remove-item, pode me dizer em qual linha o aposInicializado é chamado nesse evento?

Entendi Diego, a parte de executar uma unica vez quando carrega os componentes ficou claro, porém o que está me causando confusão é a chamada do removeItem.

A TD que contem o botão está assim:

a class="remove-item" href="">(remover)

Não tem nada apontando para o método removeItem.

E a unica chamada do removeItem é dentro da função aposInicializado: var aposInicializado = function() {

$(".remove-item").click(removeItem); $("#undo").click(undo); atualizaDados(); };

Eu não entendo de onde ele chama o método removeItem. O que queria entender como ele no link e acha essa linha $(".remove-item").click(removeItem); dentro do método aposInicializado.

Obrigado pela ajuda!

solução!

Vou tentar explicar o que acontece no método aposInicializado, nessa linha:

$(".remove-item").click(removeItem);

1) $(".remove-item") :Nessa primeira parte o jQuery seleciona todos os elementos, já estão carregados na sua página, que contenham a class "remove-item", sendo o caso do link da TD. O que diz ao jQuery que o "remove-item" é uma class é o ponto no início deste.

2) .click(removeItem): Nessa segunda parte o jQuery está adicionando a função removeItem ao evento click dos elementos selecionados na primeira parte.

Ou seja, essa linha significa o seguinte: jQuery, selecione todos os elementos da página que contenham a class "remove-item" e adiciona a função removeItem ao evento click desses elementos. Dessa forma a função removeItem será chamada quando o evento click dos elementos for disparado.

Espero ter ajudado.

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