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

Chamando metodo dentro de metodo

Fala Galera, minha primeira duvida no forum, estou com uma classe FormularioController onde chamo uma funcao AJAX para envio de formulario. Tudo esta funcionando corretamente, exceto o metodo _clearForm(), que nao 'e localizado.

O que est'a havendo de errado?

Muito obrigado

class FormularioController{

  constructor(){
    let $ = document.querySelector.bind(document); // function alias
    this._imputNome = $('#nome');
    this._imputEmail = $('#email');
    this._imputTelefone = $('#telefone');
    this._imputMensagem = $('#mensagem');
  }

  send(event){
    event.preventDefault(); // take out form defaut behaviour

    let nome = this._imputNome.value;
    let email = this._imputEmail.value;
    let telefone = this._imputTelefone.value;
    let mensagem = this._imputMensagem.value;

    /* ainda nao implementei as regras corretamente ;) */
    if (!/\w/.test(nome)){
      throw new Error('formato de nome errado');
    }else if (!/^\w*(\.\w*)?@\w*\.[a-z]+(\.[a-z]+)?$/.test(email)){
      throw new Error('formato de email errado');
    }else if (!/^\d/.test(telefone)){
      throw new Error('formato de telefone errado');
    }else if (!/\w/.test(mensagem)){
      throw new Error('formato de mensagem errado');
    }else{
      // funcao ajax
      let xhr = new XMLHttpRequest();
      xhr.open("POST", "php/mail.php", true);
      //Send the proper header information along with the request
      xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      xhr.onreadystatechange = function() {//Call a function when the state changes.
        if(xhr.readyState == 4 && xhr.status == 200) {
          console.log("fim do request");
          this._clearForm();
        }
      }
      xhr.send(`nome=${nome}&telefone=${telefone}&email=${email}&mensagem=${mensagem}`);
    }
  }

  _clearForm(){
    console.log("entrou no limpar")
    this._imputNome.value = " ";
    this._imputEmail.value = " ";
    this._imputTelefone.value = " ";
    this._imputMensagem.value = " ";
    this._imputNome.focus();
  }

}
7 respostas
solução!

Fala meu aluno!

Muito bom! Aplicando o que aprendeu no curso. Então, vamos lá.

Ele não encontrou o método porque você usou uma function e não uma arrow function. Quando você usou function aqui:

xhr.onreadystatechange = function() {//Call a function when the state changes.
        if(xhr.readyState == 4 && xhr.status == 200) {
          console.log("fim do request");
          this._clearForm();
        }
}

O this do callback passado será dinâmico, ou seja, ele vai ser o xhr. Se você trocar por uma arrow function, o this será estático e apontará sempre para o this da classe.

// meu aluno, estava faltando  o {  aqui! 
xhr.onreadystatechange = () => {

        if(xhr.readyState == 4 && xhr.status == 200) {
          console.log("fim do request");
          this._clearForm();
        }
}

Depois dá uma revisada na parte 2 do curso:

https://cursos.alura.com.br/course/javascript-es6-orientacao-a-objetos-parte-2/task/17451

Se não chegou nele ainda, sugiro terminar todos os módulos para ficar cangaceiro em JavaScript.

Muito obrigado pela resposta professor Flavio, quando mudo a funcao para arrow, apesar da mesma limpar os campos no navegador, 'e exibida uma mensagem de erro no meu console

Uncaught SyntaxError: Unexpected token if

Referente ao trecho:

 if(xhr.readyState == 4 && xhr.status == 200) {
  • Existe alguma restricao ao uso de if dentro de uma funcao arrow?

  • Poderia permanecer com uma funcao tradicional e chamar o meu metodo usando _parent, _root ou algo deste tipo?

Muito obrigado mais uma vez e parab'ens pelo excelente trabalho.

Leandro

O que você teve foi um erro de sintaxe. Não há restrição nenhuma. Só olhar com calma e ver onde esqueceu algum bloco ou algo parecido.

Se não quiser usar a arrow function, no início da chamada do método (eu ensino isso no curso de JavaScript avançando) você faz:

send(event) {
    let that = this;
}

Dai, na hora que quiser chamar o método dentro de funções faça that.__clearForm().

Mas fica a dica de terminar os 3 curso de JavaScript, pois você pode melhorar esse código em muito. Por exemplo, nem vai precisar usar o XMLHttpRequest.

Além disso, ainda aprenderá a organizar melhor seu código, confie em mim. Mas como você esta praticando, eu até entendo que queria já sair aplicando o que aprendeu. Justo!

Abração!

Ahhh! No código da Arrow function que te passei eu esqueci de abrir um bloco, foi mal! Eu alterei lá o post anterior. por isso você teve erro!

Tranquilo agora, meu aluno? :)

Muito obrigado professor, funcionou perfeitamente agora.

Como vc disse, quero praticar para fixar bem os conhecimentos do modulo um, mas 'e certo que irei continuar a carreira Engenheiro JS.

Um excelente curso, bem detalhado e claro.

Parabens a vc e aos profissionais da Alura pelo 'otimo trabalho.

Um otimo fim de semana.

Leandro

Para você também. Só fique ligado que a parte 2 é um pouco mais puxada. Depois, a parte 3 alivia um pouco, mas ensinando coisas interessantíssimas para você se tornar um cangaceiro em JavaScript.

Sucesso e bom estudo Leandro!