Quiero tener una fábrica que devuelva un usuario de mi base de datos.

Estoy definiendo la fábrica así:

angular.module('myapp')
  .factory('UserFactory', function ($http, $q, $cookieStore, AuthTokenFactory) {

    function profile () {
      var deferred = $q.defer();
      $http.get('/getprofile')
        .sucess(function (data, status, headers, config) {
          deferred.resolve(data);
        })
        .error(function (data, status, headers, config) {
          deferred.reject(data);
        });

      console.log('something');
      return deferred.promise;   
    }; 

    var user = {
      profile: profile
    };

    return user;

Sin embargo, más tarde, cuando intento acceder a las propiedades del objeto de usuario, en un controlador como este:

$scope.user = UserFactory; 

Y trato de acceder a user.name (que es devuelto por mi base de datos) obtengo TypeError: undefined is not a function

¿Por qué es esto? O, ¿cómo configuro una propiedad de una fábrica con datos de mi servicio?

1
Startec 6 feb. 2015 a las 08:41

2 respuestas

La mejor respuesta

El método 'getprofile' es asincrónico y devuelve una promesa. Debe asignar un usuario mediante la API de promesa:

UserFactory.profile().then(function(response) {
     $scope.user = reponse.data;
});

Además, no necesita $ q porque $ http () ya devuelve una promesa:

function profile () {
    return $http.get('/getprofile');
}
1
pixelbits 6 feb. 2015 a las 05:56

Yo lo haría:

angular.module('myapp')
  .factory('UserFactory', function ($http, $cookieStore, AuthTokenFactory) {

    var request;
    var user = {};

    user.ctrl = function(callback) {
      request = $http.get('/getprofile')
        .sucess(function (data, status, headers, config) {
          user.name = data.name;
         // etc
         return callback(user)
        })
        .error(function (data, status, headers, config) {
          // handle your error
        });
       return request
    };
    user.isReady = function() { (!request) ? true : false };

    return user;
};

Y luego puede llamar al ctrl para 'crear' el usuario y usar la función isReady para asegurarse de que se realiza la llamada http o usar la función de devolución de llamada.

0
Florian 6 feb. 2015 a las 06:07