====== 2.8 Modulos ======
Por ahora hemos visto unas cuantas directivas de angular ((pero aún quedan muchas por ver)). Pasemos a explicar qué son los módulos en AngularJS.
En todos los ejemplo que hemos visto ya hemos hecho uso de los módulos en AngularJS con la siguiente línea:
var app=angular.module("app",[]);
Pero, ¿qué es un módulo? Podríamos verlo como un paquete de Java. Es como una forma de agrupar funcionalidades de Angular. Por ejemplo, podríamos crear varias directivas relacionadas con google Maps. Lo normal sería agrupar todas esas directivas en un único módulo y luego al crear nuestra aplicación decir que vamos a usar dicho módulo.
Sigamos viendo lo que es un módulo mediante los métodos de JavaScript que ofrece AngularJS.
===== Usando módulos =====
Veamos ahora distintas operaciones sobre los módulos.
==== Crear un módulo ====
Podemos crear un módulo llamado "AA" mediante la siguiente línea:
angular.module("AA",[]);
Al ejecutarlo se crea el módulo "AA". Aunque no contiene ninguna funcionalidad, será necesario añadirla posteriormente.
¿Por qué debemos incluir los corchetes? Desgraciadamente no existe un método para obtener una referencia a un módulo y otro distinto para crear . En ambos casos se usa el método ''module()''. Si incluimos un segundo parámetro con los corchetes, estamos indicando que se está creando , pero si no incluimos el segundo parámetro lo que hacemos es pedir un módulo que ya existe.
Recuerda poner los corchetes al crear un módulo:
angular.module("AA",[]);
==== Obtener un módulo ====
Para obtener una referencia a un módulo ya creado usaremos la siguiente línea:
var moduloAA=angular.module("AA");
Ahora en la variable de JavaScript ''moduloAA'' tenemos una referencia al módulo llamado ''AA'', el cual existía previamente.
==== Crear y obtener un módulo ====
Lo normal no es crear un módulo y luego obtener una referencia a él sino hacerlo todo en la misma línea:
var moduloAA=angular.module("AA",[]);
Ahora en la variable de JavaScript ''moduloAA'' tenemos una referencia al módulo llamado ''AA'', el cual acabamos de crear.
¿Se entiende ahora la primera línea de todos los ejemplos de AngularJS?
===== Artefactos =====
En los módulos se pueden definir diversos artefactos ((he usado esa palabra aunque no exista en la documentación de AngularJS)) que permitirán configurar nuestra aplicación.
Un artefacto es por ejemplo una directiva o un controlador , teniendo que definir estos artefactos en módulos de AngularJS.
==== Controladores ====
Por ahora hemos visto que crear un controlador es simplemente crear una función JavaScript con el nombre de dicho controlador. Esta no es una forma adecuada de crear un controlador, lo correcto es añadir el controlador al módulo de nuestra aplicación.
var app=angular.module("app",[]);
app.controller("PruebaController",function($scope) {
$scope.mensaje="Hola Mundo";
});
* Línea 1: La variable ''app'' contiene una referencia al módulo que acabamos de crear llamado ''app''. Esta variable ''app'' contiene ,entre otros, un método llamado ''controller'' que nos permite añadir controladores a nuestro módulo.
* Línea 3: Creamos un controlador llamado "PruebaController", el cual añadimos al módulo ''app''.
El método ''controller'' acepta dos parámetros, el primero es el nombre del controlador y el segundo la función ((Ya veremos posteriormente como la forma correcta sería pasar un array)) con el código JavaScript del controlador.
Todos los controladores que usemos en nuestra aplicación deben siempre definirse dentro de un módulo y no como funciones sueltas.
É es importante ya que a partir de la versión **1.3** de AngularJS no funcionarán los controladores que no estén dentro de un módulo.
==== Directivas ====
Hemos visto algunas directivas en AngularJS pero nosotros podemos crear nuestras propias directivas, para ello deberemos usar el método ''directive'' del módulo.
app.directive('mapa', function() {
});
Ya veremos más adelante cómo crear nuevas directivas pero por ahora simplemente recordad que al igual que los controladores, las directivas deben añadirse a un módulo.
==== Otros artefactos ====
Hasta ahora hemos visto que AngularJS dispone de 2 artefactos :
* Controladores
* Directivas
AngularJs dispone de otros tipos de artefactos que iremos viendo a lo largo del curso y que también deben añadirse a los módulos:
* Filtros
* Constantes
* Servicios
* Factorias
* Providers
* Config
* Run
* Etc.
Es decir y para acabar con la explicación de qué es un módulo:
//Un módulo es donde se añaden los distintos artefactos que usaremos en nuestra aplicación.//
===== Dependencias =====
En cualquier aplicación que desarrollemos acabaremos organizando nuestro código en distintos módulos o usando [[http://ngmodules.org/|módulos de terceros]].
¿Cómo indicamos que AngularJS debe cargar el código de los otros módulos? Es decir, ¿cómo le decimos que nuestro módulo depende de otros módulos? Por fin vamos a explicar el significado de los corchetes al crear un módulo. Si sabes algo de JavaScript ya habrás deducido que los 2 corchetes corresponden a un array vacío. Pero, ¿qué significado tiene dicho array? Pues son la lista de nombre de módulos de los que dependemos.
Veamos un ejemplo:
var moduloA=angular.module("A",[]);
var moduloB=angular.module("B",[]);
var app=angular.module("app",["A","B"]);
* Línea 1: Se crea el módulo "A"
* Línea 2: Se crea el módulo "B"
* Línea 4: Se crea el módulo "app" pero indicamos que depende de los módulos "A" y "B".
¿Qué implicaciones tiene que el módulo "app" dependa de los módulos "A" y "B"?
AngularJS por defecto sólo nos permite usar los artefactos que hemos definido en nuestro módulo principal ,es decir, en el que hemos indicado en la directiva ''ng-app'' en el tag '''' que en nuestros ejemplos es el módulo ''app''. El resto de módulos aunque los creemos no se podrán utilizar ya que el módulo principal no depende de ellos. Por ello la dependencia de módulos permite que podamos usar los artefactos de otros módulos.
==== Transitividad ====
La carga de módulos es transitiva , veamos un ejemplo:
var moduloT=angular.module("T",[]);
var moduloA=angular.module("A",["T"]);
var moduloB=angular.module("B",[]);
var app=angular.module("app",["A","B"]);
* Línea 1: Ahora creamos un nuevo módulo llamado "T"
* Línea 3: El módulo "A" ahora depende del módulo "T"
Ahora el módulo "app" depende de los módulos "A" y "B" pero el módulo "A" a su vez depende del módulo "T". ¿Qué implica ésto? Que en nuestra aplicación podremos usar cualquier artefacto definido en los módulos "app", "A", "B" y "T".
==== Carga de módulos ====
Llegados a este punto , parece que los módulos son una cosa muy útil para organizar nuestro código JavaScript y con las relaciones transitivas nos podemos ahorrar mucho trabajo.
Pero hay un asunto en el que no habrás caído: para que funcione todo ésto, todo el código JavaScript debe estar cargado en la página. ¿Cómo? Sí, te estoy diciendo que aún debes seguir añadiendo manualmente todos tus ficheros "js" con todo el código JavaScript.
AngularJS no va a ahorrarte cosas como lo siguiente:
Es decir , suponiendo que cada módulo y todos sus artefactos están en un único fichero , deberemos cargar los 4 ficheros explícitamente en el ''index.html''. :-(
Sin embargo , aunque AngularJS no tenga nada referido a la carga de ficheros JavaScript sí hay otros proyectos que pueden ayudarnos como:
* [[http://requirejs.org/|RequireJS]]
* [[https://github.com/hansl/angularjs-loader|angularjs-loader]]
Aunque hay que tomarlos con cautela ya que aún no hay una solución definitiva a la carga de ficheros JavaScript.
Recuerda que siempre debes cargar todos los ficheros JavaScript con la etiqueta ''