Hola chicos, en la publicación pasada vimos cómo el método .value() es  muy simple de implementar para compartir datos, el día de hoy veremos como el método .factory() también nos puede ayudar a la hora de compartir datos entre las vistas de nuestro proyecto. 

El servicio factory de AngularJs nos permite llamar a otros servicios a través de inyecciones de dependencias (Dependency Injection) y también provee servicios de inicialización. 

 

.factory('demoService', function demoServiceFactory(){
  return 'abc123';
});
 

La función puede o no tener un nombre function demoServiceFactory(), sin embargo no es necesario pero se considera una buena práctica colocarle nombre a la función. 

El ejemplo anterior funcionara pero es algo muy primitivo. Cómo bien lo mencionamos factory puede llamar a otros servicios (un servicio es esencialmente una pequeña clase a la cuál nosotros podemos acceder una vez que es inyectada en nuestros controladores), vamos a crear un servicio e inyectarlo en nuestro demoService:

.factory('anotherService', function ['demoService', anotherServiceFactory(demoService){
  return demoService;
});
 

Así cómo un valor, factory también puede retornarnos cualquier tipo de JavaScript. En el siguiente ejemplo estamos retornando un objeto:

.factory('anotherService', function ['demoService',
  anotherServiceFactory(demoService){
    return {
      connect: function(){
      }
    };
  });
 

El método connect definido en el objeto que estamos retornando será directamente accesible cuando nosotros inyectemos el servicio en nuestro controlador.

.controller('indexController', function($scope, anotherService){
    anotherService.connect();
});
 

Ahora bien, un ejemplo del servicio factory:

.factory('contacts', function(){
    var contacts = [
        {
            name: 'Cristina Santana',
            phone: '0123456789',
            address: 'Colima, México',
            email: 'telecristy@email.com',
            website: 'Codejobs.biz',
            notes: ''
        },
        {
            name: 'Carlos Santana',
            phone: '91234859',
            address: 'Manzanillo, México',
            email: 'carlos@codejobs.biz',
            website: 'Codejobs.biz',
            notes: 'Algunas notas acerca del contacto.'
        }
    ];
    return {
        get: function(){
            return contacts;
        },
        find: function(index){
            return contacts[index];
        }
    };
})
 

Vamos a inyectar el servicio anterior (contacts) dentro de nuestro controlador:

.controller('indexController', function($scope, contacts){
    $scope.contacts = contacts.get();
})
 

Fuente: Learning Web Development with Bootstrap and AngularJS by Stephen Radford

@telecristy. 

¿Te gustó esta publicación? Márcala como favorita