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

Classes com ajax e acesso com "this"

Pessoal,

Eu não consigo acessar meu this._listaNotificacoes.adiciona dentro do escopo do ajax.

Meu codigo retorna o JSON certinho, mas não consigo acessar o this._listaNotificacoes , a não ser que passe como parametro do metodo; alguem sabe como proceder?

Edit: pelo que notei, a partir do success o this "se perde"

class NotificacoesController {

    constructor(usuario, idioma){
        this._usuario = usuario;
        this._idioma = idioma;

        this._pagina = 1;
        this._cdNotificacao = 0;
        this._cdNotificacaoUsuario = 0;
        this._dsNotificacao = "";
        this._dtCriacao = "";
        this._dsIcone = "";

        this._listaNotificacoes = new ListaNotificacoes();

        this.criaNotificacao();
    }

    criaNotificacao() {

        $.ajax({
            type: 'GET',
            url: 'xyz',
            success: function (retornoNotificacoes) {
                retornoNotificacoes.forEach(function(ntf){

                    let notifica = new Notificacao(ntf.cdNotificacao, 
                     ntf.cdNotificacaoUsuario, 
                     ntf.dsNotificacao, 
                     ntf.dtCriacao, 
                     ntf.dsIcone);

                    this._listaNotificacoes.adiciona(notifica); // Aqui da o problema, se passo como parametro do metodo ele funciona.

                });
            }
        });


    }
}
2 respostas
solução!

Diego, quando você chama o this, o contexto que ele está aplicado não aponta para sua classe e sim para seu objeto de retorno de notificacoes, pode dar um console.log para testar :)

Para resolver isso, você tem que usar as arrow-functions, nas suas duas funções que você criou. que mantem o this do objeto que você está trabalhando, no caso a sua classe.

Obrigado Mario, resolvido!

 criaNotificacao() {

        $.ajax({
            type: 'GET',
            url: 'XPTO'
            success: (retornoNotificacoes) => {


                retornoNotificacoes.forEach((ntf) => {

                    let notifica = new Notificacao(ntf.cdNotificacao, 
                     ntf.cdNotificacaoUsuario, 
                     ntf.dsNotificacao, 
                     ntf.dtCriacao, 
                     ntf.dsIcone);

                    this._listaNotificacoes.adiciona(notifica);

                });

            }
        });

    }