En este tema retornamos el ejemplo del seguro médico para añadir el servicio de rutas y de paso hacer otros cambios que ya podemos hacer.
La lista de modificaciones a realizar es la siguiente:
idSeguro
.get
del servicio remoteResource
acepte como argumento el idSeguro
.main.html
index.html
.resolve
y usarlos desde el controlador.resolve
y usarlos desde el controlador.Ahora el formato de los datos JSON es el siguiente:
{ "idSeguro": 3, "nif": "29069345J", "nombre": "Jose", "ape1": "Aguado", "edad": 56, "sexo": "H", "casado": true, "numHijos": 2, "embarazada": false, "coberturas": { "oftalmologia": true, "dental": true, "fecundacionInVitro": false }, "enfermedades": { "corazon": true, "estomacal": true, "rinyones": true, "alergia": false, "nombreAlergia": "" } }
Hemos hecho este cambio ya que ahora se podrán obtener los datos de un seguro concreto usando la propiedad idSeguro
para obtenerlo.
Ahora, en vez de tener un solo fichero llamado datos.json
tenemos 8 ficheros distintos llamados:
datos1.json
datos2.json
datos3.json
Éso nos permite que desde el método get
del servicio remoteResource
acepte como argumento el idSeguro
y ya podemos leer sólo los datos que queremos.
El método get
ahora queda de la siguiente forma
this.get = function(idSeguro) { var defered=$q.defer(); var promise=defered.promise; $http({ method: 'GET', url: baseUrl + '/datos' + idSeguro + '.json' }).success(function(data, status, headers, config) { defered.resolve(data); }).error(function(data, status, headers, config) { defered.reject(status); }); return promise; }
idSeguro
$htpp
Al añadir la rutas, la página index.html
sólo contiene las partes comunes a todas las páginas, como la cabecera y el pie. Por ello es necesario añadir una nueva página llamada main.html
que será la que se muestre inicialmente.
El contenido de esta página es solamente el enlace para mostrar listado.html
.
<a href="#/seguro/listado" >Listado de seguros medicos</a>
A la página listado.html
se accede mediante la ruta /seguro/listado
.
Ahora vamos a añadir las rutas para poder navegar a las 3 páginas:
main.html
listado.html
detalle.html
app.config(['$routeProvider',function($routeProvider) { $routeProvider.when('/', { templateUrl: "main.html", controller: "MainController" }); $routeProvider.when('/seguro/listado', { templateUrl: "listado.html", controller: "ListadoSeguroController" }); $routeProvider.when('/seguro/edit/:idSeguro', { templateUrl: "detalle.html", controller: "DetalleSeguroController" }); $routeProvider.otherwise({ redirectTo: '/' }); }]);
Hemos creado las 3 rutas para las 3 páginas.
El path de la ruta de listado.html
se llamará /seguro/listado
en vez de únicamente /listado
. Hemos hecho este cambio porque así las rutas están mucho más organizadas. ¿Qué pasaría si tuviéramos más de un listado de otras entidades? Por ello es mejor añadir delante /seguro
. Lo mismo pasa con el path de la ruta de detalle.html
.
También en el path de la ruta de detalle.html
se ha añadido el parámetro idSeguro
. Ésto nos permitirá que, al ir a la página sólo se muestren los datos del seguro definido en el parámetro idSeguro
en vez de él mismo, como se hacía hasta ahora.
Al añadir las rutas hemos tenido que hacer otros 2 cambios:
angular-route.min.js
en index.html
<script src='//ajax.googleapis.com/ajax/libs/angularjs/1.2.19/angular-route.min.js'></script>
ngRoute
var app = angular.module("app", ['ngRoute']);
Ahora ya no es necesario incluir la cabecera ni el pie en listado.html
ni en detalle.html
puesto que ahora se muestran dentro de index.html
En index.html
hemos añadido la directiva ng-view
para indicar que las páginas se muestren entre la cabecera y el pie.
<!DOCTYPE html> <html ng-app="app"> <head> <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.19/angular.js"></script> <script src='//ajax.googleapis.com/ajax/libs/angularjs/1.2.19/angular-route.min.js'></script> <script src="//code.angularjs.org/1.2.19/i18n/angular-locale_es-es.js"></script> <script src="script.js"></script> </head> <body ng-controller="MainController"> <ng-include src="'cabecera.html'"></ng-include> <div ng-view></div> <ng-include src="'pie.html'"></ng-include> </body> </html>
ng-view
para que aquí se muestren las otras páginas.
Como ya tenemos rutas y parámetros, desde la página de listado.html
ahora se podrá navegar a detalle.html
para ver el detalle de cada uno de los seguros.
Para ello sólo hemos añadido un link con la ruta correspondiente a detalle.html
.
Filtrar por apellido:<input ng-model="filtro.ape1" > <table> <thead> <tr> <th>NIF</th> <th>Nombre</th> <th>Apellido</th> <th>Sexo</th> </tr> </thead> <tfoot> <tr> <td colspan="3">El Nº de seguros medicos es:</td> <td ng-bind="seguros.length"></td> </tr> </tfoot> <tbody> <tr ng-repeat="seguro in seguros| filteri18n:{ape1:filtro.ape1}" ng-style="{color:($odd?'red':'green')}"> <td><a ng-href="#/seguro/edit/{{seguro.idSeguro}}">{{seguro.nif}}</a></td> <td>{{seguro.nombre}}</td> <td>{{seguro.ape1}}</td> <td ng-switch on="seguro.sexo"> <span ng-switch-when="H">Hombre</span> <span ng-switch-when="M">Mujer</span> <span ng-switch-when=""></span> <span ng-switch-default>Desconocido</span> </td> </tr> </tbody> </table>
/seguro/edit/:idSeguro
. Y fíjate que hay que incluir la almohadilla ”#” al inicio de la ruta. Ésto es lo que permite que al pinchar se vaya a la página de detalle.html
y se vean todos los datos del seguro.
Para evitar que al aparecer la página de listado un instante después aparezca la tabla con los datos, vamos a obtener los datos en el resolve
de la ruta.
Para ello hemos modificado la definición de la ruta de la siguiente forma:
$routeProvider.when('/seguro/listado', { templateUrl: "listado.html", controller: "ListadoSeguroController", resolve: { seguros:['remoteResource',function(remoteResource) { return remoteResource.list(); }] } });
resolve
que contiene el objeto con los datos a resolver.remoteResource
el cual necesitamos para obtener los datos.
Ahora en el controlador ya no es necesario que llamemos a remoteResource.list()
sino que solamente hay que inyectar seguros
y ya tendremos los datos.
app.controller("ListadoSeguroController", ['$scope', 'seguros',function($scope, seguros) { $scope.seguros = seguros; }]);
seguros
que contiene el array con todos los datos que se obtuvieron al llamar a remoteResource.list()
$scope
y se mostrarán en la tabla HTML.Como ya tenemos el array con todos los datos, en cuanto se muestre la página ya se verá la tabla con toda la información.
Para evitar que al aparecer la página de detalle , aparezcan los datos en los campos un instante después, vamos a obtener los datos en el resolve de la ruta.
Para ello hemos modificado la definición de la ruta de la siguiente forma:
$routeProvider.when('/seguro/edit/:idSeguro', { templateUrl: "detalle.html", controller: "DetalleSeguroController", resolve: { seguro:['remoteResource','$route',function(remoteResource,$route) { return remoteResource.get($route.current.params.idSeguro); }] } });
Línea 4: Se añade la propiedad resolve
que contiene el objeto con los datos a resolver.
Línea 5: Se inyecta el servicio remoteResource
el cual necesitamos para obtener los datos. También se inyecta el servicio de $route
para poder obtener el valor del parámetro idSeguro
ya que lo necesitamos ahora para poder obtener únicamente el seguro indicado en idSeguro
.
Línea 6: Aquí es donde se llama para obtener los datos y se retorna la promesa.Vemos que al método get
le pasamos el idSeguro
para obtener sólo el seguro que queremos.
Ahora en el controlador ya no es necesario que llamemos a remoteResource.get() sino que sólo hay que inyectar seguro
y ya tendremos los datos.
app.controller("DetalleSeguroController", ['$scope', 'seguro',function($scope, seguro) { $scope.filtro = { ape1: "" } $scope.sexos = [{ codSexo: "H", descripcion: "Hombre" }, { codSexo: "M", descripcion: "Mujer" }]; $scope.seguro = { nif: "", nombre: "", ape1: "", edad: undefined, sexo: "", casado: false, numHijos: undefined, embarazada: false, coberturas: { oftalmologia: false, dental: false, fecundacionInVitro: false }, enfermedades: { corazon: false, estomacal: false, rinyones: false, alergia: false, nombreAlergia: "" }, fechaCreacion: new Date() } $scope.seguro = seguro; }]);Línea 1: Inyectamos el servicio
seguro
que contiene los datos que se obtuvieron al llamar a remoteResource.get(idSeguro)
Línea 40: Ahora simplemente los guardamos en el $scope y se mostrarán en el formulario HTML.
Como ya tenemos el objeto con todos los datos, en cuanto se muestre la página ya se verá toda la información en el formulario .