Como todo proyecto organizado no podemos tener toda la logica y/o funcionalidades core en controladores y mucho menos en vistas, AngularJs tiene el concepto de Servicio esto lo implementan de 2 formas, Service y Factory, ambos podrian ser usados del la misma manera pero es bueno tener en cuenta como funcionan para así sacarles el mas provecho.
Antes de hablar de service y demás cosas es bueno saber que AngularJS maneja el concepto/funcionalidad de inyección de dependencia (dependency injection), Angular utiliza esto a la hora de requerir cierto componente desde cualquier parte de la aplicación este es inyectado a nuestro controlador (Digamos). Este concepto lo usamos desde el principio, un ves decimos en nuestro controlador:
//angularjs DI function mainController($scope){ } //
Lo que angular esta haciendo en este caso es inyectar una instancia del $scope a nuestro controlador, esta inyección no siempre sera la misma por ejemplo cuando inyecta $scope es un scope limpio digamos una instancia nueva mas sin embargo una vez inyectemos un servicio o factory sera la misma instancia en toda la aplicación.
Service
Los Servicios en angular son declarados de la forma app.service y son inyectados en los controladores u otros servicios o factorías. Un servicio se declara de la siguiente manera:
// var app = angularjs.module('test',[]) app.service('ServiceName',function(){ this.holaMundo = function(){ // codigo magico } }) //
El servicio puede ser utilizado en un controlador de esta manera
// app.contorller('controllerName',function(ServiceName){ ServiceName.holaMundo(); }) //
De esta forma es como se declara y como se usa/consume un servicio con AngularJS, ahora si notan en el servicio estoy usando el keyword this que lo que esta haciendo es declarar una propiedad de esa objeto en esa función, esto es por que cuando AngularJS crea la instancia de mi servicio este lo hace usando «new MyService()» y de esa forma es que me retorna la instancia de mi servicio.
Factory
Las factorías en AngularJS son declaradas de forma app.factory y al igual que los servicio estos pueden tener dependencias de otros servicios y/ factorías.
Una factoria se declara de la siguiente manera:
// var app = angularjs.module('test',[]) app.factory('Factoria',function(){ var data = { holaMundo : function(){ // codigo magico } } return data; }) //
La factoria puede ser utilizado en un controlador de la siguiente manera
// app.contorller('controllerName',function(Factoria){ Factoria.holaMundo(); }) //
A diferencia del servicio lo que AngularJS realiza para retornar el singleton de mi factoría es retornar lo que yo retorno de mi factoría mas no usando el keyword new sobre mi factoría, por esta razón es que tengo un objeto data y ahi es donde tengo/creo toda la funcionalidad.
Hasta este punto la pregunta que sobresale es «Cuando usar un service o cuando usar una factoría?», bueno mi recomendación es ir a las definiciones de lo que es un servicio y una factoría, una servicio es para exponer una funcionalidad x utilizada en varios lugares de la aplicación mas una factoría es para crear objetos complejos, pero todo esto es una recomendación, cada quien programa como entienda. 😀