¡Esta es una revisión vieja del documento!
En este tema vamos a ver el servicio de factory. La principal diferencia ahora es que al método factory le pasamos ahora una función para que ésta retorne ahora el valor del servicio. Es decir que tenemos una función JavaScript que actúa como factoría, retornando la propia función de factoría el valor del servicio.
Para que se entienda vamos a ver los ejemplos que teníamos con el value ahora como un factory.
var app=angular.module("app",[]);
app.factory("idioma",function() {
return "es-es";
});
app.factory("matematicas_simples",function() {
return {
sumar:function(a,b) {
return a+b;
},
restar:function(a,b) {
return a-b;
}
}
});
app.factory("radio",function() {
return 10;
});
app.factory("area",function() {
return function(radio) {
return 3.1416*radio*radio;
}
});
app.controller("PruebaController",["$scope","idioma","matematicas_simples","radio","area",function($scope,idioma,matematicas_simples,radio,area) {
$scope.idioma=idioma;
$scope.suma=matematicas_simples.sumar(3,6);
$scope.area=area(radio);
}]);
sumar y restar. Al ser un factory ahora le pasamos la función anónima de factoría que retorna el objeto JavaScript.value o factory, etc.
Al igual que en el service se podían inyectar dependencias en el constructor , en un factory se pueden inyectar dependencias en la función de factoría.
Vamos a hacer el ejemplo del tema anterior del service con la clase Rectangulo usando un servicio:
var app=angular.module("app",[]);
app.value("tamanyoInicialRectangulo",{
ancho:2,
alto:3
});
function Rectangulo(tamanyoInicial) {
this.ancho=tamanyoInicial.ancho;
this.alto=tamanyoInicial.alto;
this.setAncho=function(ancho) {
this.ancho=ancho;
}
this.setAlto=function(alto) {
this.alto=alto;
}
this.getArea=function() {
return this.ancho * this.alto;
}
}
app.factory("rectangulo",['tamanyoInicialRectangulo',function(tamanyoInicialRectangulo) {
var rectangulo=new Rectangulo(tamanyoInicialRectangulo);
return rectangulo;
}]);
app.controller("PruebaController",["$scope","rectangulo",function($scope,rectangulo) {
$scope.area=rectangulo.getArea();
}]);
tamanyoInicialRectangulo simplemente añadiendo el array con el nombre y poniendo la variable como argumento de la función.rectangulo. Vemos como le estamos pasando al constructor, el valor que inyectamos a la función.
Esta es la típica pregunta que aparece siempre en los foros de AngularJS y la respuesta es bastante sencilla. Realmente da igual cual uses porque todos acaban siendo un provider para AngularJS. Pero aun así ¿cual es mas recomendable?
service: Solo tendrás que pasarle el nombre de la clase y ya está.value: Solo tendrás que pasarle ese valor y ya está.factory: Es lo mas complejo de usar así que debería ser siempre la última opción.
En el siguiente tema por fin veremos el provider el cual tiene una funcionalidad extra al factory que si la necesitamos hará que debamos usarlo.