3.4 Tipos de servicios

Hasta ahora hemos visto cómo usar varios tipos de servicios pero pasemos ahora a crear nuestros propios servicios.

Como ya dijimos al principio de esta unidad realmente hay 5 tipos de servicios que son:

Bloques

Antes de ver las diferencias entre ellos veamos 2 nuevos artefactos de AngularJS:

Bloque config

Un bloque config es una función que definimos en nuestro código pero que se ejecutará al iniciar un programa en AngularJS para configurar un provider. Se define llamando al método config de un módulo.

Veamos un ejemplo:

app.config(function() {
  //Pon aquí el código que quieras
});
siendo app un módulo de Angular

Podemos definir tantos bloques config como queramos en una aplicación

Bloque run

El bloque run es, al igual que el bloque config, una función que se ejecuta al iniciar un programa en AngularJS. Se define llamando el método run de un módulo.

Veamos un ejemplo:

app.run(function() {
  //Pon aquí el código que quieras
});
siendo app un módulo de Angular

Podemos definir tantos bloques run como queramos en una aplicación

Diferencias

¿Cuáles son las diferencias entre un bloque config y un bloque run?

La primera diferencia es que primero se ejecutan todos los bloques config y luego todos bloques run.

El bloque run sería mas parecido al típico main de cualquier programa , podemos poner el código que queramos. Un bloque config por otro lado sirve para configurar los provider.

En un bloque run se puede acceder al $rootScope mientras que en un bloque config no se puede. Ya veremos más adelante qué es el $rootScope.

Ya veremos en detalle qué es un provider pero por ahora sabed que es la forma de configurar nuestros servicios antes de que podamos usarlos en un bloque run o en el resto de la aplicación.

Así que tenemos un servicio que queremos que sea configurable, así que usamos un provider para permitir que dicho servicio sea configurable y usamos el bloque config para configurar el provider que a su vez configura nuestro servicio.

Tipos

Volvamos ahora a los tipos de servicios. La diferencia principal entre ellos es dónde se pueden inyectar mientras se inicializa la aplicación, es decir que según el tipo de servicio los podremos inyectar en un bloque config o en un bloque run o en otro servicio, etc.

La siguiente tabla indica dónde se pueden inyectar o donde no inyectar cada uno de los servicios al iniciar la aplicación.

Se puede inyectar en un
Tipo Provider Bloque config Servicio 1) Bloque run
constant Si Si Si Si
provider Si 2) Si No No
value No No Si Si
service No No Si Si
factory No No Si Si
factory-provider 3) No No Si Si

Una vez iniciada la aplicación, cualquiera de ellos , excepto el provider, ya se puede inyectar en cualquier otro artefacto como un controlador, directiva , etc.

El siguiente diagrama de actividad explica los pasos que realiza AngularJS al iniciar una aplicación.

PlantUML Graph

  • Actividad 1: Se puede ver cómo lo primero que se hace es inicializar las constant, por lo tanto éstas se pueden inyectar en cualquier sitio.
  • Actividad 2: Seguidamente se crean los provider
  • Actividad 3: Se llaman a los bloques config. Por lo tanto en un bloque config se puede inyectar tanto una constant como un provider. En un bloque config lo que se hace es configurar los provider.
  • Actividad 4: Ahora es cuando se llama a todos los servicios normales que son los value , service , factory y factory-provider. Llegados a este punto los provider no están accesibles ya que al estar ya configurados solo se tiene acceso a los factory-provider correspondientes a sus provider.
  • Actividad 5: Se llama al bloque run para inicializar la aplicación pudiendo inyectar cualquier tipo de servicio excepto los provider

Como es de esperar, AngularJS no permite la referencias circulares entre servicios. En ese caso se producirá el error:

Uncaught Error: [$injector:cdep] Circular dependency found: s1 <- s2 <- s1

Siendo 's1' y 's2' los servicios con referencias entre ellos.

Para acabar, decir que no creo que se haya entendido todo lo que he dicho en esta página ya que es bastante densa. En los siguientes temas seguimos hablando con todo ésto por lo que espero que finalmente se entienda.

1) service, factory o factory-provider
2) Pero únicamente si está definido en otro módulo
3) Es la función factory llamada $get que genera el servicio dentro del provider
unidades/03_servicios/04_tiposservicios.txt · Última modificación: 2014/09/07 14:46 por admin
Ir hasta arriba
CC Attribution-Share Alike 3.0 Unported
chimeric.de = chi`s home Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0