¡Esta es una revisión vieja del documento!
En este tema vamos a ver el servicio de factory
. La principal diferencia 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.
Vamos a explicar ahora un ejemplo en el que necesitamos la función factory 1).
Vamos a suponer que necesitamos enviar el hash de una contraseña a un servidor. El servidor acepta
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.
constant
ya que éste es distinto a los 3 anteriores 2) ya que permite ser inyectado en un bloque config y en un provider
cosa que ninguno de los 3 anteriores permite, por lo que si necesitamos esa funcionalidad deberemos usar obligatoriamente constant
.