'', que habilitáramos para ello. La forma de decirle a Angular dónde tiene que cargar la página HTML de la ruta es simplemente añadiendo la directiva [[https://docs.angularjs.org/api/ngRoute/directive/ngView|ng-view]] al elemento donde quedamos que se cargue.
Veamos un ejemplo:
* Líneas 5, 6, 7 y 8: Cargamos una única vez todo el JavaScript y así ahorramos tiempo al no tener que volver a cargarlo en cada nueva ruta a la que naveguemos.
* Línea 12: Ésta es la cabecera de la aplicación y como no cambia entre las distintas páginas la ponemos en la página principal.
* Línea 14: En este ''
'' al incluir la directiva ''ng-view'' es donde se cargarán las páginas HTML de las rutas.
* Línea 16: Éste es el pie de la aplicación y como no cambia entre las distintas páginas lo ponemos en la página principal.
===== Navegando =====
Ya tenemos todo preparado pero ahora falta saber cómo se navega a la ruta. Hay dos formas:
* Link desde HTML
* Servicio [[https://docs.angularjs.org/api/ng/service/$location|$location]] desde JavaScript
==== Link desde HTML ====
La solución es muy fácil, realmente cada ruta es un fragmento de la URL actual, así que sólo tenemos que navegar al fragmento correspondiente a la ruta.
Si tenemos definida la ruta:
/pagina1
Podemos poner un link de la siguiente forma:
Ir a la pagina 1
Recuerda poner la almohadilla "#" antes de las rutas en los links.
==== Servicio $location desde JavaScript ====
Desde JavaScript AngularJS tiene un servicio que permite navegar a las rutas. Este servicio se llama [[https://docs.angularjs.org/api/ng/service/$location|$location]].
No vamos a describir todas las funcionalidades de [[https://docs.angularjs.org/api/ng/service/$location|$location]]. Únicamente decir que tiene un método llamado ''path'' al que le pasamos la ruta y hace que se navegue hasta esa ruta.
Si tenemos definida la ruta:
/pagina1
por ejemplo, en un controlador podemos hacer lo siguiente:
app.controller("Pagina1Controller", ["$scope","$location",function($scope,$location) {
$scope.irPagina1 = function () {
$location.path("/pagina1");
};
}]);
* Línea 1: Inyectamos el servicio de $location
* Línea 3: Creamos una nueva función que permite navegar a la ruta "/pagina1"
* Línea 4: Llamamos al método ''$location.path'' para navegar a la ruta "/pagina1"
Ahora desde cualquier parte de la página ya podemos llamar al método y navegar a esa ruta.
Recuerda que al usar el servicio de ''$location'' no hay que poner la almohadilla "#"
===== Módulo ng-route =====
Una cosa a tener en cuenta al usar las rutas es que todo lo relacionado con ellas está en un módulo separado del núcleo de AngularJS llamado ''ngRoute'' y en un fichero llamado ''angular-route.js'', por lo tanto deberemos:
* Cargar el fichero JavaScript
* Hacer que nuestra aplicación dependa del módulo ''ngRoute''
En la página principal del fichero HTML deberemos cargar el fichero JavaScript mediante:
Y al crear el módulo de nuestra aplicación deberemos hacer que dependa de él:
var app = angular.module("app", ['ngRoute']);
Para usar las rutas , recuerda cargar el fichero ''angular-route.js'' y hacer que tu aplicación dependa del módulo ''ngRoute''
var app = angular.module("app", ['ngRoute']);
===== Alternativa: ui-router =====
Acabamos de ver el funcionamiento básico de las rutas en AngularJS 1.2 y en los siguientes temas veremos más funcionalidades del módulo de rutas de AngularJS 1.2. Sin embargo, el módulo de rutas de AngularJS 1.2 tiene una funcionalidad muy básica. En aplicaciones reales no deberíamos usarlo y como substituto //de facto// está el proyecto [[https://github.com/angular-ui/ui-router|UI Router]]. [[https://github.com/angular-ui/ui-router|UI Router]] tiene muchas más funcionalidades y debe ser nuestra primera elección como servicio de rutas.
El equipo de AngularJs tiene pensado mejorar el servicio de rutas para AngularJS 2.0 pero la versión 2.0 aún queda muy lejos en el tiempo por lo que no es una opción todavía pero en el momento de escribir este curso [[https://twitter.com/bradlygreen/|Brad Green]] , un desarrollador de AngularJS,[[https://twitter.com/bradlygreen/status/494959485488594944|twitteó]] que piensan añadir a Angular 1.3 el sistema de rutas de Angular 2.0 por lo que dentro de poco tendremos un servicio de rutas adecuado en AngularJS y no será necesario [[https://github.com/angular-ui/ui-router|UI Router]].
Por todo ello he decidido no contar [[https://github.com/angular-ui/ui-router|UI Router]] ya que dentro de poco no será tan necesario al tener ya un servicio de rutas adecuado en AngularJS 1.3. Así que me he centrado en contar el sistema actual que es bastante sencillo, a sabiendas de que cuando salga AngularJS 1.3 deberías aprender el nuevo servicio de rutas.
Si tienes que hacer ahora un proyecto real usa [[https://github.com/angular-ui/ui-router|UI Router]] pero si puedes esperar a AngularJS 1.4 (el 5 de Marzo de 2015) mejor usa su servicio de rutas.
**Actualización 20/10/2014.**
Hace unos días se ha publicado la versión 1.3 de AngularJS y no tiene el nuevo sistema de rutas así que tendremos que esperar a AngularJS 2.0 para verlo. Por lo tanto recuerda en proyectos reales usar [[https://github.com/angular-ui/ui-router|UI Router]]
**Actualización 28/10/2014**
Vuelve a haber nuevas noticias sobre éste tema.En las conferencias de [[http://ngeurope.org/|ng-europe]] ((la conferencia europea sobre AngularJS)), hubo una charla el 24/10/2014 titulada [[http://ng-workshop.com/en/article/new-router-angularjs-ng-europe-2014|The new Router for AngularJS]], en ella se dijo que el nuevo sistema de rutas será portado a AngularJS 1.3.
**Actualización 15/12/2014**
Mas noticias sobre éste tema.En el blog de AngularJS se ha publicado el [[http://angularjs.blogspot.com.es/2014/12/planning-angular-14.html|plan para Angular 1.4]] e incluye el nuevo sistema de rutas!!!! La versión estará para el 5 de Marzo de 2015 coincidiendo con la [[http://www.ng-conf.org/|ng-conf]]
===== Ejemplo =====
El ejemplo que vamos a hacer es una página principal llamada ''index.html'' y 3 páginas que se cargarán dentro de ella. También vamos a poner 3 enlaces para poder cambiar entre las distintas páginas.
Éste es el título y no cambia
Ésto es un pie y no cambia
Las 3 páginas que forman parte de las rutas se llaman: ''pagina1.html'' , ''pagina2.html'' y ''pagina3.html'' y su código es el siguiente:
Soy la pagina 1
{{mensaje}}
Soy la pagina 2
{{mensaje}}
Soy la pagina 3
{{mensaje}}
Por último, el fichero con el JavaScript es el siguiente
var app = angular.module("app", ['ngRoute']);
app.config(['$routeProvider',function($routeProvider) {
$routeProvider.when('/pagina1', {
templateUrl: "pagina1.html",
controller: "Pagina1Controller"
});
$routeProvider.when('/pagina2', {
templateUrl: "pagina2.html",
controller: "Pagina2Controller"
});
$routeProvider.when('/pagina3', {
templateUrl: "pagina3.html",
controller: "Pagina3Controller"
});
$routeProvider.otherwise({
redirectTo: '/pagina1'
});
}]);
app.controller("Pagina1Controller", ["$scope",function($scope) {
$scope.mensaje="Texto cargado desde el controlador Pagina1Controller";
}]);
app.controller("Pagina2Controller", ["$scope",function($scope) {
$scope.mensaje="Texto cargado desde el controlador Pagina2Controller";
}]);
app.controller("Pagina3Controller", ["$scope",function($scope) {
$scope.mensaje="Texto cargado desde el controlador Pagina3Controller";
}]);
Como este ejemplo necesita ver cómo cambia la URL del navegador , es mejor abrir en una nueva página el [[http://run.plnkr.co/plunks/seiE7MkRCUZDIpGVYgzK|ejemplo]].
{{url>http://embed.plnkr.co/seiE7MkRCUZDIpGVYgzK}}
===== Referencias =====
* [[https://docs.angularjs.org/api/ngRoute/provider/$routeProvider|$routeProvider]]
* [[https://docs.angularjs.org/api/ngRoute/directive/ngView|ng-view]]