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

Problemas em passar um valor do service para o controller

Olá pessoal, estou com o seguinte problema no meu service eu tenho uma rotina de autenticação, ela vai no banco verifica se o usuario que esta tentando logar existes, e retorna as informações dele, colocando o valor retornado através da função setInfoUser().

verify:function(user){

            $http.post("/user/auth",user).success(function(data){
                //muda o status para true, significa que ele exite
                Authentication.setStatus(true);
                //data contem as informaçoes do usuario (nome,email,etc..)
                Authentication.setInfoUser(data);

            }).error(function(erro){

                console.log(erro);

            });
        }

Quando eu chamo a função dentro do service, que mostra o valor da variavel onde esta os dados do usuario, as informações aparecem

// Authentication é o meu objeto, que contém as funções  para setar os dados(setInfoUser) e para pegar(getInfoUser)
 Authentication.getInfoUser();

Porem quando eu chamo meu servico dentro do meu controller, com a mesma função que esta no meu service (getInfoUser), o valor vem como undefined

angular.module('modulo_principal').controller('meuController',function($scope,Authentication){

    $scope.logar = function(){
        //Chama a função que verifica se o usuario existe e retorna as informações         
        Authentication.verify(user);
        //Chama a função dentro do service que pega as informações da variavel user
        console.log(Authentication.getUser());

    }

});

Gostaria de saber, por que essa função dentro do meu service mostra o valor e quando eu chamo a mesma função pra retornar os valores(getInfoUser) da como undefined??

Estrutura total do service

angular.module("services",[]).factory("Authentication",function($http,$location){

    var Authentication = {

        status:false,
        token:"",
        user:"",
        getInfoUser:function(){
            return this.user;
        },
        setInfoUser:function(user){
            return this.user = user;
        },
        setStatus:function(status){
            this.status = status;
        },
        getStatus:function(){
            return this.status;
        },    
        verify:function(user){

            $http.post("/user/auth",user).success(function(data){

                Authentication.setStatus(true);
                Authentication.setInfoUser(data);

                 Authentication.getInfoUser();

                console.log( Authentication.getInfoUser(););

            }).error(function(erro){

                console.log(erro);

            });
        }

    };


    return Authentication;

})
4 respostas

Boa tarde, amigo.

Não tenho acesso ao seu código completo, entretanto, na instrução à seguir, você tenta utilizar uma variável user, onde ela está sendo declarada, pois, user está dentro de Authentication. De duas, uma:

A. Declara user para $scope

  $scope.user = {}

B. Declara user como parâmetro na function logar

   $scope.logar = function(){

fica:

   $scope.logar = function(user){
        //Chama a função que verifica se o usuario existe e retorna as informações         
        Authentication.verify(user);
        //Chama a função dentro do service que pega as informações da variavel user
        console.log(Authentication.getUser());

    }

Infelizmente nenhuma das duas alternativas, creio que o valor seja setado para a variável de uma forma meio "atrasada", dai no controller o valor não chega a tempo e no service não, posso estar falando bobagem mas se tiver outra alternativa manda que eu testo.

solução!

Oi Mauricio,

É isso que vc falou mesmo. O valor da propriedade user está sendo atribuído depois de vc tentar acessar ele nesse console.log:

angular.module('modulo_principal').controller('meuController',function($scope,Authentication){

    $scope.logar = function(){
        //Chama a função que verifica se o usuario existe e retorna as informações         
        Authentication.verify(user);
        //Chama a função dentro do service que pega as informações da variavel user
        console.log(Authentication.getUser());

    }
});

Isso acontece por causa de como o Authentication.verify foi feito:

verify:function(user){

    $http.post("/user/auth",user).success(function(data){
        //muda o status para true, significa que ele exite
        Authentication.setStatus(true);
        //data contem as informaçoes do usuario (nome,email,etc..)
        Authentication.setInfoUser(data);

    }).error(function(erro){

        console.log(erro);

    });
}

Quando a função verify termina a única coisa que é garantida é que o $http.post tentou chegar lá no banco. A gente que está desenvolvendo nunca vai saber quando o $http.post termina. Por isso, pra executar qualquer coisa quando o $http.post termina e usar os dados que vieram do banco, a gente precisa mostrar pro $http.post o que ele deve executar quando terminar, é por isso que vc passa aquela função como parâmetro no .success.

Se vc quiser executar Authentication.getUser() lá no controller, quando o o $http.post dentro do Authentication.verify() terminar, vai precisar ter acesso ao resultado do $http.post() lá no controller, pra poder fazer um .success lá também.

Uma das coisas que vc pode fazer é usar o .success do $http.post lá no controller. Pra isso vai precisar retornar ele como resultado do Authentication.verify(). O código ficaria assim:

verify:function(user){
    return $http.post("/user/auth",user)
}

E lá no controller vc faria o success pra acessar as infos do usuário:

angular.module('modulo_principal').controller('meuController',function($scope,Authentication){

    $scope.logar = function(){

    //Chama a função que verifica se o usuario existe e retorna as informações         
    Authentication.verify(user).success(function(data){
        //muda o status para true, significa que ele exite
        Authentication.setStatus(true);
        //data contem as informaçoes do usuario (nome,email,etc..)
        Authentication.setInfoUser(data);

    }).error(function(erro){

        console.log(erro);

    });

        //Chama a função dentro do service que pega as informações da variavel user
        console.log(Authentication.getUser());

    }
});

O que achou? Se ficou estranha a explicação avisa aí =)

Nossaa faz todo o sentido, como não pensei nisso :S, agora ficou claro. Valeu Arthur