Académique Documents
Professionnel Documents
Culture Documents
index.html
script.js
?
index.html
1
2
3 <!DOCTYPE html>
4 <html ng-app="app">
5
<head>
6 <script
7 src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.19/angular.min.js"
8 ></script>
9 <script src="script.js"></script>
1 </head>
0
<body ng-controller="PruebaController">
1 <h1>{{mensaje}}</h1>
1 </body>
1
2 </html>
1
3
?
script.js
1var app=angular.module("app",[]);
2
3function PruebaController($scope) {
4 $scope.mensaje="Hola Mundo";
5}
En todas las aplicaciones que he hecho siempre he llamado al mdulo principal app,
nunca le llamo realmente tienda o banco o lo que sea. El por qu de ello es que creo
que realmente no aporta nada poner un nombre descriptivo y tener siempre en toda la
aplicacin disponible una variable llamada app con el mdulo principal de la aplicacin
me resulta muy til.
Recuerda que al crear el mdulo hay que aadir un segundo parmetro con un array
vacio:
?
1var app=angular.module("app",[]);
Si no lo haces as angular dar un error diciendo que no existe el mdulo app.En el
tema de mdulos explicaremos por qu es necesario el array.
$scope
Pasemos ahora a explicar con un poco ms de detalle qu es el $scope ya que es de las
cosas ms importantes de Angular.
?
1var i=5;
?
1$scope.i=5;
Por qu hacer sto? Porque angular slo muestra la informacin en el HTML mediante
{{ }} de aquellas propiedades del $scope y no de cualquier variable de JavaScript.
Podemos seguir creando variable con var pero no las podremos mostrar en el HTML si
no estn en el $scope 2).
databinding
El Data-binding es el concepto mas importante de angular y lo que hace es relacionar el
HTML con nuestro modelo de datos. Es lo que acabamos de ver de poner las {{ }} en
el HTML y que se transforme con los datos del JavaScript
index.html
2
<!DOCTYPE html>
3
<html ng-app="app">
4
5
<head>
6 <script
7 src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.19/angular.min.js"
></script>
8 <script src="script.js"></script>
9 </head>
1
0
<body ng-controller="PruebaController">
1
<h1>{{mensaje}}</h1>
1
<button ng-click="cambiarMensaje()">Cambio</button>
1
2 </body>
1
3 </html>
1
4
Lnea 11: Est la nueva directiva ng-click que permite especificar una funcin
JavaScript que se ejecutar al pulsar sobre el elemento. El mtodo a ejecutar es
cambiarMensaje().
script.js
1
var app=angular.module("app",[]);
2
3 function PruebaController($scope) {
4 $scope.mensaje="Hola Mundo";
6 $scope.cambiarMensaje=function() {
}
8
9
}
10
Lineas 6-8: Vemos cmo hemos definido una nueva propiedad llamada
cambiarMensaje cuyo valor es una funcin annima en JavaScript y que no tiene
parmetros. El cuerpo de la funcin es simplemente cambiar el texto de la propiedad
mensaje al nuevo valor Adios mundo cruel .
Puede parecer un poco extrao la forma de definir una funcin en el $scope pero lo que
hacemos es crear la funcin , sin nombre, y luego se la asignamos a la propiedad
cambiarMensaje. De esa forma la propiedad cambiarMensaje realmente es una funcin y
podra se llamada de la siguiente forma:
1$scope.cambiarMensaje();
sto, que parece una cosa de poca importancia, es una de las cosas ms fascinantes de
AngularJS. Antes de AngularJS si cambibamos el valor de una variable en JavaScript debamos
llamar explicitamente a alguna funcin creada por nosotros que actualizara el HTML y rezar
para que no se nos olvidara llamarlo ya que sino el HTML no se actualizara. Ahora con
AngularJs podemos olvidarnos de ello. Siempre que cambiamos el valor de una variable 2)
AngularJS automticamente actualiza el HTML. La de lneas de cdigo y dolores de cabeza que
nos vamos a ahorrar con sto.
databinding
Seguimos con el Data-binding y vemos ahora que al modificar el modelo
automticamente se regenera el HTML.
La generacin del HTML se produce tambin cada vez que cambia el modelo
Otros eventos
Al igual que ng-click existen otras directivas de tratamiento de eventos:
Eventos de teclado
Eventos de ratn
Si lo nico que quieres es comprobar como cambia el valor de una propiedad del $scope ,
siempre que puedas no utilices ninguno de los eventos anteriores , para comprobar si cambia
el valor de una propiedad del $scope est la funcin $watch
Ejemplo
2.3 Entrada de datos
Por ahora hemos visto cmo generar informacin desde JavaScript y mostrarla en la
pgina HTML. En este tema vamos a ver cmo usando el tag <input> podemos pasar la
informacin desde el HTML a las variables de JavaScript. Es decir, vamos a modificar
la variable mensaje del $scope desde la propia pgina HTML mediante el tat <input>.
index.html
3
<!DOCTYPE html>
4
<html ng-app="app">
5
6
<head>
7
<script
8 src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.19/angular.min.js"
></script>
9
<script src="script.js"></script>
1 </head>
0
1
1 <body ng-controller="PruebaController">
<h1>{{mensaje}}</h1>
1
2 <button ng-click="cambiarMensaje()">Cambio</button>
1 <br>
3 Mensaje:<input ng-model="mensaje" >
1
4
</body>
1
5
</html>
1
6
1
7
Linea 13: Lo nico que hemos aadido es un <input> pero con la directiva de angular
ng-model. Esta directiva indica qu variable del $scope est asociado a este
<input>. Si ejecutas el ejemplo vers cmo al escribir texto en el <input>
automticamente se modifica el texto del ttulo <h1> en la pgina HTML. Tambin
prueba a pulsar en el botn Cambia y mira lo que ocurre.
script.js
1
var app=angular.module("app",[]);
2
3 function PruebaController($scope) {
4 $scope.mensaje="Hola Mundo";
6 $scope.cambiarMensaje=function() {
}
8
9
}
10
databinding
Seguimos con el Data-binding y vemos ahora que al escribir el usuario en el <input> se
modifica el modelo (la variable JavaScript), lo que hace que se vuelva a regenerar el
HTML.
Y lo mejor de todo es que no cuesta nada hacer las modificaciones en nuestro modelo de
JavaScript. Es tan sencillo como modificar una variable de JavaScript y el HTML se
actualiza.La de tiempo de manejar el DOM que vas a ahorrarte!
El precio
Por ahora son todo ventajas pero como todo en la vida todo tiene un precio. Cul es el
precio por sincronizar automticamente el modelo y el HTML?
Antes de responder a la pregunta hay que ver cmo hace AngularJS esta sincronizacin.
Lo que hace angular es antes de cualquier evento en angular (por ejemplo un ng-click)
guardarse el estado del $scope y cuando acaba el evento comprueba que se ha
modificado del $scope respecto a su copia original. De esa forma sabe que tiene que
actualizar.
Para ambos problemas realmente hay solucin. Lo nico es que cuando tengamos que
resolverlos se perder parte de la sencillez de AngularJS , pero como se deca antes:
Nadie da duros 1) a 4 pesetas.
Para los problemas de rendimiento podemos ver una posible solucin en : Optimizing
AngularJS: 1200ms to 35ms y para los problemas de jQuery veremos durante el curso
los trucos a usar.
2.4 Formulario
Ahora que ya tenemos un conocimiento inicial de angular , ya podemos empezar a hacer
un ejemplo un poco ms real.El objetivo de este tema es crear un formulario (AngularJS
tiene muchas ms funcionalidades relativas a formularios que veremos ms adelante)
que permita la entrada de datos de un hipottico seguro mdico.
Modelo
Ya hemos visto la importancia del modelo de datos para AngularJS as que vamos a
definir nuestro modelo del ejemplo del seguro mdico:
?
index.html
<!DOCTYPE html>
1 <html ng-app="app">
2 <head>
3 <script
4 src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.19/angular.min.js"
></script>
5 <script src="script.js"></script>
6 </head>
7 <body ng-controller="SeguroController">
8 <form>
<fieldset>
9
<legend>Seguro Mdico</legend>
1 <label for="nif">NIF:</label><input id="nif" name="nif"
0 type="text" ng-model="seguro.nif" /><br>
<label for="nombre">Nombre:</label><input id="nombre"
1 name="nombre" type="text" ng-model="seguro.nombre" /><br>
1 <label for="ape1">1 Apellido:</label><input id="ape1"
1 name="ape1" type="text" ng-model="seguro.ape1" /><br>
2 <label for="edad">Edad:</label><input id="edad" name="edad"
type="text" ng-model="seguro.edad" /><br>
1 <label for="sexo">Sexo:</label><select id="sexo" name="sexo"
3 type="checkbox" ng-model="seguro.sexo" ><option value="">--Elige
1 opcion--</option><option value="H">Hombre</option><option
4 value="M">Mujer</option></select><br>
1 <label for="casado">Casado:</label><input id="casado"
name="casado" type="checkbox" ng-model="seguro.casado" /><br>
5 <label for="numHijos">N Hijos:</label><input id="numHijos"
1 name="numHijos" type="text" ng-model="seguro.numHijos" /><br>
6 <label for="embarazada">Embarazada:</label><input
1 id="embarazada" name="embarazada" type="checkbox" ng-
model="seguro.embarazada" /><br>
7 <label for="fechaCreacion">Fecha de
1 creación:</label><input id="fechaCreacion" name="fechaCreacion"
8 type="text" ng-model="seguro.fechaCreacion" /><br>
1 </fieldset>
9 <fieldset>
<legend>Coberturas</legend>
2 <label for="oftalmologia">Oftalmologia:</label><input
0 id="oftalmologia" name="oftalmologia" type="checkbox" ng-
2 model="seguro.coberturas.oftalmologia" /><br>
1 <label for="dental">Dental:</label><input id="dental"
2 name="dental" type="checkbox" ng-model="seguro.coberturas.dental"
/><br>
2 <label for="fecundacionInVitro">Fecundacion In
2 Vitro:</label><input id="fecundacionInVitro" name="fecundacionInVitro"
3 type="checkbox" ng-model="seguro.coberturas.fecundacionInVitro" /><br>
2 </fieldset>
<fieldset>
4 <legend>Enfermedades</legend>
2 <label for="corazon">Corazon:</label><input id="corazon"
5 name="corazon" type="checkbox" ng-model="seguro.enfermedades.corazon"
2 /><br>
6 <label for="estomacal">Estomacal:</label><input
id="estomacal" name="estomacal" type="checkbox" ng-
2 model="seguro.enfermedades.estomacal" /><br>
7 <label for="rinyones">Riñones:</label><input
2 id="rinyones" name="rinyones" type="checkbox" ng-
8 model="seguro.enfermedades.rinyones" /><br>
<label for="alergia">Alergia:</label><input id="alergia"
2 name="alergia" type="checkbox" ng-model="seguro.enfermedades.alergia"
9 /><br>
3 <label for="nombreAlergia">Nombre de la
0 alergia:</label><input id="nombreAlergia" name="nombreAlergia"
3 type="text" ng-model="seguro.enfermedades.nombreAlergia" /><br>
</fieldset>
1 </form>
3 </body>
2 </html>
3
3
3
4
3
5
3
6
3
7
Lnea 15: Se puede ver cmo hemos usado el tag <select> en vez de un
<input>. AngularJS reconoce perfectamente el tag <select> y no hay que
hacer nada especial con l 1). Lo que aparece en el atributo value de los tag
<option> es lo que se guardar como valor en JavaScript. En este caso los
valores son H y M.
Lnea 16: Al igual que con el <option> ahora hacemos uso de un tag <input>
del tipo checkbox. Si lo marcamos en JavaScript se guardar un true y si lo
desmarcamos se guardar un false. Es decir, que no hace falta hacer nada
especial para usar un booleano.
* Lnea 19: Vemos cmo la fecha se muestra en formato ingls. Este problema ya lo
arreglaremos ms adelante ya que el tratamiento de fechas no es sencillo.
?
script.js
1
2
3 var app=angular.module("app",[]);
4
5 function SeguroController($scope) {
6 $scope.seguro={
7 nif:"",
nombre:"",
8 ape1:"",
9 edad:undefined,
10 sexo:"",
11 casado:false,
numHijos:undefined,
12 embarazada:false,
13 coberturas: {
14 oftalmologia:false,
15 dental:false,
16 fecundacionInVitro:false
},
17 enfermedades:{
18 corazon:false,
19 estomacal:false,
20 rinyones:false,
alergia:false,
21 nombreAlergia:""
22 },
23 fechaCreacion:new Date()
24 }
25}
26
27
Lnea 4: Lo ms importante aqu es que todas las propiedades de nuestro modelo
no estn en el $scope sino que creamos un nuevo objeto con las propiedades de
nuestro modelo y ste se asigna al $scope.
Lneas 13 y 18: Vemos cmo hemos creado otros objetos dentro del objeto
principal. sto es algo normal en cualquier lenguaje para poder organizar las
propiedades de nuestro modelo. As ,por ejemplo, para acceder a propiedad
alergia tendrs que escribir:
?
1$scope.seguro.enfermedades.alergia
En AngularJS hay un dicho que dice: Si el valor de tu directiva ng-model no incluye
un punto es que est mal.
Qu quiere decir so? Que nunca pongas propiedades con valores directamente en el
$scope sino que crees un objeto con las propiedades que necesites y asignes dicho
objeto al $scope
Por qu necesitamos hacer so? El motivo es que Angular en ciertas directivas crear
nuevos scopes que heredarn de tu $scope y si pones las propiedades directamente en el
$scope fallarn en ciertos casos y te costar descubrir qu ha pasado.
?
1$scope.nif="";
En ese caso la directiva ng-model tiene el valor nif, es decir que NO tendra punto,
por lo que sera incorrecta.
2.5 Directiva ng-disabled
La directiva ng-disabled nos permite habilitar o deshabilitar un elemento de entrada
de datos como un <input> un <select> o un <button>.
En nuestro ejemplo del seguro mdico tenemos el campo Nombre de la alergia. Este
campo slo tiene sentido que est habilitado cuando el usuario ha marcado que tiene
alguna alergia, as que vamos a hacer que slo est habilitado el <input> del nombre de
la alergia cuando el valor $scope.seguro.enfermedades.alergia valga true. Es decir
que si marcamos que tenemos alergia , entonces se habilitar el nombre de la alergia y si
no marcamos que tenemos alergia se deshabilitar el campo del nombre de la alergia.
index.html
1 <!DOCTYPE html>
2 <html ng-app="app">
3 <head>
4 <script
src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.19/angular.min.js"
5 ></script>
6 <script src="script.js"></script>
</head>
7
<body ng-controller="SeguroController">
8
<form>
9
<fieldset>
1
<legend>Seguro Mdico</legend>
0
<label for="nif">NIF:</label><input id="nif" name="nif"
1 type="text" ng-model="seguro.nif" /><br>
1
<label for="nombre">Nombre:</label><input id="nombre"
1 name="nombre" type="text" ng-model="seguro.nombre" /><br>
2 <label for="ape1">1 Apellido:</label><input id="ape1"
name="ape1" type="text" ng-model="seguro.ape1" /><br>
1
3 <label for="edad">Edad:</label><input id="edad" name="edad"
type="text" ng-model="seguro.edad" /><br>
1
4 <label for="sexo">Sexo:</label><select id="sexo" name="sexo"
type="checkbox" ng-model="seguro.sexo" ><option value="">--Elige
1 opcion--</option><option value="H">Hombre</option><option
5 value="M">Mujer</option></select><br>
1 <label for="casado">Casado:</label><input id="casado"
6 name="casado" type="checkbox" ng-model="seguro.casado" /><br>
1 <label for="fechaCreacion">Fecha de
creación:</label><input id="fechaCreacion" name="fechaCreacion"
9
type="text" ng-model="seguro.fechaCreacion" /><br>
2 </fieldset>
0
<fieldset>
2
<legend>Coberturas</legend>
1
<label for="oftalmologia">Oftalmologia:</label><input
2 id="oftalmologia" name="oftalmologia" type="checkbox" ng-
2 model="seguro.coberturas.oftalmologia" /><br>
2 <fieldset>
6 <legend>Enfermedades</legend>
2 <label for="corazon">Corazon:</label><input id="corazon"
7 name="corazon" type="checkbox" ng-model="seguro.enfermedades.corazon"
/><br>
2
<label for="estomacal">Estomacal:</label><input
8
id="estomacal" name="estomacal" type="checkbox" ng-
2 model="seguro.enfermedades.estomacal" /><br>
9 <label for="rinyones">Riñones:</label><input
id="rinyones" name="rinyones" type="checkbox" ng-
3 model="seguro.enfermedades.rinyones" /><br>
0
<label for="alergia">Alergia:</label><input id="alergia"
3 name="alergia" type="checkbox" ng-model="seguro.enfermedades.alergia"
1 /><br>
<label for="nombreAlergia">Nombre de la
3
alergia:</label><input ng-
2 disabled="seguro.enfermedades.alergia===false" id="nombreAlergia"
</form>
3 </body>
4 </html>
3
5
3
6
3
7
Lnea 33: Se puede ver que hemos incluido la directiva ng-disabled. Su valor es la
expresin en JavaScript seguro.enfermedades.alergia===false. En caso de
que la anterior expresin sea verdadera se deshabilitar el <input>.
script.js
1 var app=angular.module("app",[]);
3 function SeguroController($scope) {
$scope.seguro={
4
nif:"",
5
nombre:"",
6
ape1:"",
7
edad:undefined,
8 sexo:"",
9 casado:false,
10 numHijos:undefined,
11 embarazada:false,
12 coberturas: {
oftalmologia:false,
13
dental:false,
14
fecundacionInVitro:false
15
},
16
enfermedades:{
17 corazon:false,
18 estomacal:false,
19 rinyones:false,
20 alergia:false,
21 nombreAlergia:""
},
22
fechaCreacion:new Date()
23
}
24
}
25
26
27
Expresin de la directiva
Hemos visto en el ejemplo anterior que en ng-disabled se ha usado la expresin
seguro.enfermedades.alergia===false. Pero, qu se puede poner realmente como
valor del atributo?. La respuesta sencilla es que se puede poner cualquier expresin
JavaScript pero se evaluar referida al $scope. La respuesta un poco ms complicada es
que realmente no es JavaScript sino un subconjunto de l. Es AngularJS el que se
encarga de interpretar las expresiones por lo que no podremos usar cualquier expresin
de JavaScript sino slo aquello que haya implementado AngularJS en su interprete de
las expresiones.
Alguno de los motivos por el que AngularJS ha creado su propio interprete de expresiones es:
1seguro.edad>15
1seguro.nif===null || seguro.nif===""
1seguro.nombre==="Carlos"
1$scope.disabledNombreAlergia=function() {
2 return ($scope.seguro.enfermedades.alergia===false)
3}
?
<input ng-disabled="disabledNombreAlergia()" id="nombreAlergia"
1name="nombreAlergia" type="text" ng-
model="seguro.enfermedades.nombreAlergia" />
Otra posibilidad es que a la funcin se le pueden pasar parmetros, tanto literales como
valores del $Scope o incluso el resultado de otras funciones. Todo sto recordad que se
evalua referido siempre al $scope.
1 $scope.suma=function(a,b) {
return a+b;
2
}
3
4
$scope.isNegativo=function(c) {
5
if (c<0) {
6
return true;
7
} else {
8 return false;
9 }
10}
11
Hemos definido la funcin suma que acepta dos parmetros y la funcin isNegativo
que acepta uno.
?
<input ng-disabled="isNegativo(suma(seguro.edad,10))"
1id="nombreAlergia" name="nombreAlergia" type="text" ng-
model="seguro.enfermedades.nombreAlergia" />
Antes de AngularJS 1) debamos comprobar todas las veces que cambibamos el valor
de alergia yacordarnos de ejecutar la regla que deshabilitaba el campo nombre de la
alergia. sto resultaba un problema ya que era fcil que olvidramos ejecutar dicha
reglas.
Aunque pueda parecer sencillo, el tema se complicaba mucho al haber muchas reglas y
muchos valores que disparaban esa reglas. Estas reglas suelen ser del tipo:
El problema era que las reglas se deban programar tras el cdigo que modifica X1 y
tras el cdigo que modifica X2 y tras el cdigo que modifica Xn y si cada uno de
ellos se modifica en varios sitios, hacerlo en cada uno de ellos, cuando lo realmente
cmodo sera poner la regla una nica vez y que se llamara automticamente cuando
hiciera falta.
Gracia a AngularJS ahora slo es necesario poner la regla una nica vez y ya se llamar
cada vez que se modifique alguno de los valores de los que depende. so simplifica
significativamente nuestro cdigo ya que ahora slo ponemos la regla una nica vez
independientemente de cuntos valores dependa y de en cuntos sitios se modifique
cada uno de esos valores.
2.6 Directiva ng-show
La directiva ng-show permite que un elemento de la pgina se haga visible o invisible
en funcin de cualquier valor del $scope y por lo tanto de nuestro modelo. Es muy
similar a la directiva ng-disabled pero en vez de deshabilitar lo que hace es mostrar el
elemento si la expresin es true o hacerlo invisible si la expresin es false.
La forma que tiene angular de hacer invisible el elemento es incluyendo el estilo CSS de
display:none.
En nuestro ejemplo slo tiene sentido que est la cobertura de Fecundacin In Vitro si el
sexo de la persona es mujer.As que slo va a estar visible la cobertura de Fecundacin
In Vitro si el sexo es M.
?
index.html
1 <!DOCTYPE html>
2 <html ng-app="app">
<head>
3 <script
4 src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.19/angular.min.js"
5 ></script>
6 <script src="script.js"></script>
7 </head>
<body ng-controller="SeguroController">
8 <form>
9 <fieldset>
1 <legend>Seguro Mdico</legend>
0 <label for="nif">NIF:</label><input id="nif" name="nif"
type="text" ng-model="seguro.nif" /><br>
1 <label for="nombre">Nombre:</label><input id="nombre"
1 name="nombre" type="text" ng-model="seguro.nombre" /><br>
1 <label for="ape1">1 Apellido:</label><input id="ape1"
2 name="ape1" type="text" ng-model="seguro.ape1" /><br>
1 <label for="edad">Edad:</label><input id="edad" name="edad"
type="text" ng-model="seguro.edad" /><br>
3 <label for="sexo">Sexo:</label><select id="sexo" name="sexo"
1 type="checkbox" ng-model="seguro.sexo" ><option value="">--Elige
4 opcion--</option><option value="H">Hombre</option><option
1 value="M">Mujer</option></select><br>
<label for="casado">Casado:</label><input id="casado"
5
name="casado" type="checkbox" ng-model="seguro.casado" /><br>
1 <label for="numHijos">N Hijos:</label><input id="numHijos"
6 name="numHijos" type="text" ng-model="seguro.numHijos" /><br>
1 <label for="embarazada">Embarazada:</label><input
7 id="embarazada" name="embarazada" type="checkbox" ng-
model="seguro.embarazada" /><br>
1 <label for="fechaCreacion">Fecha de
8 creación:</label><input id="fechaCreacion" name="fechaCreacion"
1 type="text" ng-model="seguro.fechaCreacion" /><br>
9 </fieldset>
2 <fieldset>
<legend>Coberturas</legend>
0 <label for="oftalmologia">Oftalmologia:</label><input
2 id="oftalmologia" name="oftalmologia" type="checkbox" ng-
1 model="seguro.coberturas.oftalmologia" /><br>
2 <label for="dental">Dental:</label><input id="dental"
2 name="dental" type="checkbox" ng-model="seguro.coberturas.dental"
/><br>
2 <label ng-show="seguro.sexo==='M'"
3 for="fecundacionInVitro">Fecundacion In Vitro:</label><input ng-
2 show="seguro.sexo==='M'" id="fecundacionInVitro"
4 name="fecundacionInVitro" type="checkbox" ng-
model="seguro.coberturas.fecundacionInVitro" /><br>
2 </fieldset>
5 <fieldset>
2 <legend>Enfermedades</legend>
6 <label for="corazon">Corazon:</label><input id="corazon"
2 name="corazon" type="checkbox" ng-model="seguro.enfermedades.corazon"
/><br>
7 <label for="estomacal">Estomacal:</label><input
2 id="estomacal" name="estomacal" type="checkbox" ng-
8 model="seguro.enfermedades.estomacal" /><br>
2 <label for="rinyones">Riñones:</label><input
id="rinyones" name="rinyones" type="checkbox" ng-
9 model="seguro.enfermedades.rinyones" /><br>
3 <label for="alergia">Alergia:</label><input id="alergia"
0 name="alergia" type="checkbox" ng-model="seguro.enfermedades.alergia"
3 /><br>
1 <label for="nombreAlergia">Nombre de la
alergia:</label><input ng-
3 disabled="seguro.enfermedades.alergia===false" id="nombreAlergia"
2 name="nombreAlergia" type="text" ng-
3 model="seguro.enfermedades.nombreAlergia" /><br>
3 </fieldset>
3 </form>
</body>
4 </html>
3
5
3
6
3
7
Lnea 25: Vemos como tanto al tag <label> como al tag <input> se les ha
incluido la directiva ng-show con el valor seguro.sexo==='M'. Por lo tanto esos
dos tags slo se mostrarn cuando el sexo sea Mujer.
?
script.js
1 var app=angular.module("app",[]);
2
3 function SeguroController($scope) {
4 $scope.seguro={
nif:"",
5 nombre:"",
6 ape1:"",
7 edad:undefined,
8 sexo:"",
casado:false,
9 numHijos:undefined,
10 embarazada:false,
11 coberturas: {
12 oftalmologia:false,
13 dental:false,
fecundacionInVitro:false
14 },
15 enfermedades:{
16 corazon:false,
17 estomacal:false,
rinyones:false,
18 alergia:false,
19 nombreAlergia:""
20 },
21 fechaCreacion:new Date()
22 }
}
23
24
25
26
27
Expresin de la directiva
La expresin que se puede poner en la directiva es del mismo tipo que la expresin de la
directiva ng-disabled
Recuerda que una referencia completa de lo que se puede poner como expresin est en
angular_expressions_cheatsheet.pdf
En este caso no vamos a poner un ejemplo ya que funciona como la directiva ng-show
pero al revs.
Expresin de la directiva
La expresin que se puede poner en la directiva es del mismo tipo que la expresin de la
directiva ng-disabled
Recuerda que una referencia completa de lo que se puede poner como expresin est en
angular_expressions_cheatsheet.pdf
ng-show o ng-hide
Aunque tampoco es muy importante usar uno u otro , s que viene bien decir cundo
usar ng-show o ng-hide por coherencia en el proyecto.
Si inicialmente o lo normal es que el tag est visible y lo que queremos es que se haga
invisible cuando ocurra cierta condicin, mi recomendacin entonces es usar ng-hide
ya que as estamos indicando que la regla/accin es ocultarlo cuando ocurre cierto
evento pero que si no ocurriera estara visible.
El caso contrario sera que si inicialmente o por defecto el tag est oculto y lo que
queremos es que se haga visible cuando ocurra cierta condicin, mi recomendacin
entonces es usar ng-show ya que as estamos indicando que la regla/accin es mostrarlo
cuando ocurre cierto evento pero que si no ocurriera estara invisible.
Otro caso que suele pasar es que realmente no hay una accin que muestre u oculte el
elemento sino que en funcin del estado de otro campo est o no visible. En ese caso no
tiene sentido preguntarse por el concepto de normal o inicialmente. En este ltimo caso
lo mejor es usar el que evite una condicin negativa que siempre es un poco ms difcil
de entender.
Veamos un ejemplo de esto ltimo:
?
<input ng-show="seguro.sexo==='M'" id="fecundacionInVitro"
1name="fecundacionInVitro" type="checkbox" ng-
model="seguro.coberturas.fecundacionInVitro" />
1seguro.sexo==='M'
?
<input ng-hide="seguro.sexo!=='M'" id="fecundacionInVitro"
1name="fecundacionInVitro" type="checkbox" ng-
model="seguro.coberturas.fecundacionInVitro" />
1seguro.sexo!=='M'
Personalmente siempre me gustan ms las condiciones con === que con !== , ya
que creo que un programador las entiende mejor.
2.8 Modulos
Por ahora hemos visto unas cuantas directivas de angular 1). Pasemos a explicar qu son
los mdulos en AngularJS.
En todos los ejemplo que hemos visto ya hemos hecho uso de los mdulos en
AngularJS con la siguiente lnea:
1var app=angular.module("app",[]);
Sigamos viendo lo que es un mdulo mediante los mtodos de JavaScript que ofrece
AngularJS.
Usando mdulos
Veamos ahora distintas operaciones sobre los mdulos.
Crear un mdulo
1angular.module("AA",[]);
1angular.module("AA",[]);
Obtener un mdulo
1var moduloAA=angular.module("AA");
Lo normal no es crear un mdulo y luego obtener una referencia a l sino hacerlo todo
en la misma lnea:
1var moduloAA=angular.module("AA",[]);
Artefactos
En los mdulos se pueden definir diversos artefactos 2) que permitirn configurar
nuestra aplicacin.
Un artefacto es por ejemplo una directiva o un controlador , teniendo que definir estos
artefactos en mdulos de AngularJS.
Controladores
Por ahora hemos visto que crear un controlador es simplemente crear una funcin
JavaScript con el nombre de dicho controlador. Esta no es una forma adecuada de crear
un controlador, lo correcto es aadir el controlador al mdulo de nuestra aplicacin.
1var app=angular.module("app",[]);
3app.controller("PruebaController",function($scope) {
4 $scope.mensaje="Hola Mundo";
5});
Lnea 1: La variable app contiene una referencia al mdulo que acabamos de crear
llamado app. Esta variable app contiene ,entre otros, un mtodo llamado
controller que nos permite aadir controladores a nuestro mdulo.
Lnea 3: Creamos un controlador llamado PruebaController, el cual aadimos al
mdulo app.
Todos los controladores que usemos en nuestra aplicacin deben siempre definirse dentro de
un mdulo y no como funciones sueltas. es importante ya que a partir de la versin 1.3 de
AngularJS no funcionarn los controladores que no estn dentro de un mdulo.
Directivas
Hemos visto algunas directivas en AngularJS pero nosotros podemos crear nuestras
propias directivas, para ello deberemos usar el mtodo directive del mdulo.
1app.directive('mapa', function() {
3});
Ya veremos ms adelante cmo crear nuevas directivas pero por ahora simplemente
recordad que al igual que los controladores, las directivas deben aadirse a un mdulo.
Otros artefactos
Controladores
Directivas
AngularJs dispone de otros tipos de artefactos que iremos viendo a lo largo del curso y
que tambin deben aadirse a los mdulos:
Filtros
Constantes
Servicios
Factorias
Providers
Config
Run
Etc.
Dependencias
En cualquier aplicacin que desarrollemos acabaremos organizando nuestro cdigo en
distintos mdulos o usando mdulos de terceros.
Cmo indicamos que AngularJS debe cargar el cdigo de los otros mdulos? Es decir,
cmo le decimos que nuestro mdulo depende de otros mdulos? Por fin vamos a
explicar el significado de los corchetes al crear un mdulo. Si sabes algo de JavaScript
ya habrs deducido que los 2 corchetes corresponden a un array vaco. Pero, qu
significado tiene dicho array? Pues son la lista de nombre de mdulos de los que
dependemos.
Veamos un ejemplo:
1var moduloA=angular.module("A",[]);
2var moduloB=angular.module("B",[]);
4var app=angular.module("app",["A","B"]);
AngularJS por defecto slo nos permite usar los artefactos que hemos definido en
nuestro mdulo principal ,es decir, en el que hemos indicado en la directiva ng-app en
el tag <html> que en nuestros ejemplos es el mdulo app. El resto de mdulos aunque
los creemos no se podrn utilizar ya que el mdulo principal no depende de ellos. Por
ello la dependencia de mdulos permite que podamos usar los artefactos de otros
mdulos.
Transitividad
1var moduloT=angular.module("T",[]);
2
3var moduloA=angular.module("A",["T"]);
4var moduloB=angular.module("B",[]);
5
var app=angular.module("app",["A","B"]);
6
Carga de mdulos
Llegados a este punto , parece que los mdulos son una cosa muy til para organizar
nuestro cdigo JavaScript y con las relaciones transitivas nos podemos ahorrar mucho
trabajo.
Pero hay un asunto en el que no habrs cado: para que funcione todo sto, todo el
cdigo JavaScript debe estar cargado en la pgina. Cmo? S, te estoy diciendo que
an debes seguir aadiendo manualmente todos tus ficheros js con todo el cdigo
JavaScript.
Es decir , suponiendo que cada mdulo y todos sus artefactos estn en un nico fichero ,
deberemos cargar los 4 ficheros explcitamente en el index.html.
RequireJS
angularjs-loader
Aunque hay que tomarlos con cautela ya que an no hay una solucin definitiva a la
carga de ficheros JavaScript.
Recuerda que siempre debes cargar todos los ficheros JavaScript con la etiqueta <script>.
AngularJS no se encarga de ello aunque cree las relaciones entre los mdulos.
Varios mdulos
La mayor utilidad de los mdulos es si est haciendo una librera que ser usada por terceros.
Espacio de nombres
Una ltima caracterstica de los mdulos es el espacio de nombres. Hemos visto que al
aadir un controlador a un mdulo le indicamos su nombre, pues bien. Para AngularJS
da igual el mdulo en el que definamos el controlador, siempre nos referiremos a l por
su nombre independientemente del mdulo en el que se haya definido.
Ejemplo
Seguimos ahora con nuestro ejemplo y vamos a definir nuestro controlador en el
mdulo de nuestra aplicacin.
index.html
1 <!DOCTYPE html>
2 <html ng-app="app">
3 <head>
4 <script
src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.19/angular.min.js"
5 ></script>
6 <script src="script.js"></script>
</head>
7
<body ng-controller="SeguroController">
8
<form>
9
<fieldset>
1
<legend>Seguro Mdico</legend>
0
<label for="nif">NIF:</label><input id="nif" name="nif"
1 type="text" ng-model="seguro.nif" /><br>
1
<label for="nombre">Nombre:</label><input id="nombre"
1 name="nombre" type="text" ng-model="seguro.nombre" /><br>
2 <label for="ape1">1 Apellido:</label><input id="ape1"
name="ape1" type="text" ng-model="seguro.ape1" /><br>
1
3 <label for="edad">Edad:</label><input id="edad" name="edad"
type="text" ng-model="seguro.edad" /><br>
1
<label for="sexo">Sexo:</label><select id="sexo" name="sexo"
4
type="checkbox" ng-model="seguro.sexo" ><option value="">--Elige
1 opcion--</option><option value="H">Hombre</option><option
value="M">Mujer</option></select><br>
5
<label for="casado">Casado:</label><input id="casado"
1 name="casado" type="checkbox" ng-model="seguro.casado" /><br>
6
<label for="numHijos">N Hijos:</label><input id="numHijos"
1 name="numHijos" type="text" ng-model="seguro.numHijos" /><br>
7 <label for="embarazada">Embarazada:</label><input
1 id="embarazada" name="embarazada" type="checkbox" ng-
model="seguro.embarazada" /><br>
8
<label for="fechaCreacion">Fecha de
1 creación:</label><input id="fechaCreacion" name="fechaCreacion"
9 type="text" ng-model="seguro.fechaCreacion" /><br>
2 </fieldset>
0 <fieldset>
2 <legend>Coberturas</legend>
1
<label for="oftalmologia">Oftalmologia:</label><input
2 id="oftalmologia" name="oftalmologia" type="checkbox" ng-
model="seguro.coberturas.oftalmologia" /><br>
2
<label for="dental">Dental:</label><input id="dental"
2 name="dental" type="checkbox" ng-model="seguro.coberturas.dental"
3 /><br>
2 <label ng-show="seguro.sexo==='M'"
4 for="fecundacionInVitro">Fecundacion In Vitro:</label><input ng-
show="seguro.sexo==='M'" id="fecundacionInVitro"
2 name="fecundacionInVitro" type="checkbox" ng-
5 model="seguro.coberturas.fecundacionInVitro" /><br>
</fieldset>
2
6 <fieldset>
2 <legend>Enfermedades</legend>
7 <label for="corazon">Corazon:</label><input id="corazon"
name="corazon" type="checkbox" ng-model="seguro.enfermedades.corazon"
2 /><br>
8
<label for="estomacal">Estomacal:</label><input
2 id="estomacal" name="estomacal" type="checkbox" ng-
9 model="seguro.enfermedades.estomacal" /><br>
3 <label for="rinyones">Riñones:</label><input
id="rinyones" name="rinyones" type="checkbox" ng-
0 model="seguro.enfermedades.rinyones" /><br>
3
7
script.js
1 var app=angular.module("app",[]);
3 app.controller("SeguroController",function($scope) {
4 $scope.seguro={
5 nif:"",
6 nombre:"",
ape1:"",
7
edad:undefined,
8
sexo:"",
9
casado:false,
10
numHijos:undefined,
11 embarazada:false,
12 coberturas: {
13 oftalmologia:false,
14 dental:false,
15 fecundacionInVitro:false
},
16
enfermedades:{
17
corazon:false,
18
estomacal:false,
19
rinyones:false,
20 alergia:false,
21 nombreAlergia:""
22 },
23 fechaCreacion:new Date()
24 }
});
25
26
27
Lnea 3: Vemos cmo el controlador ya no es una funcin con nombre sino que ahora
es una funcin annima que se pasa al mtodo controller junto con el nombre del
controlador que sigue siendo SeguroController. Es decir que ahora el controlador
se define dentro del mdulo.
3.1 Servicios
Por ahora hemos visto 2 artefactos de AngularJS , los controladores y las directivas. En
esta unidad vamos a ver otro conjunto de nuevos artefactos: los servicios.
Constantes
Valores
Servicios
Factorias
Proveedores
Qu es un servicio?
Es un objeto JavaScript que nos permite obtener informacin. Aparentemente nada
nuevo que entender, sera por ejemplo un DAO en Java o un servicios de Java. Lo
importante de sto es que un servicio nunca 1) interacciona con la propia pgina, slo
con otros servicios o con un servidor de datos que pueda estar en otro Host.
El servicio $http de AngularJS. Este servicio hace la tpica llamada AJAX a un servidor
para obtener informacin de l. Como vemos, cumple perfectamente la definicin de
obtener informacin.
Un servicio que se conecta a un host que nos retorna el valor del Euribor.
Un posible servicio de clculo de Hipoteca que dados los datos de una hipoteca
(Importe del prstamo, aos, diferencial ,etc) nos calculara cunto hay que pagar
mensualmente.
Un servicio que nos hiciera las operaciones de CRUD sobre el servidor.
Un servicio que transformara los String con una fecha en un objeto Date.
El servicio $log de Angular que nos permite generar un log de nuestra aplicacin.
Etc.
Una caracterstica importante de los servicios es que slo hay una nica instancia de ellos
aunque los usemos ms de una vez,es decir que son un singleton.
Ventajas
Y qu tiene sto de especial? Por qu Angular tiene esos artefactos si quizs t ya
tengas clases JavaScript que actan como servicios? qu ventajas nos ofrecen?
Facilitar el TDD
Aunque en este curso no se trata el tema del Desarrollo guiado por pruebas o TDD, todo
AngularJs est diseado para facilitar el TDD. Un ejemplo de ello es que las instancias
de los servicios no se obtienen directamente sino que se obtienen mediante Inyeccin de
Dependencias. Es decir, en un controlador u otro servicio le diremos que deseamos una
instancia de un servicio, pero no lo crearemos mediante la palabra reservada de
JavaScript de new. Esto nos permitir al hacer TDD modificar los servicios por objetos
Mock y poder hacer pruebas unitarias de nuestros controladores o servicios.
Angular nos permite decorar los servicios. sto significa que permite que interceptemos
la creacin del servicio para poder aadir mtodos os modificar su funcionamiento. sto
es muy til, por ejemplo, para poder hacer modificaciones en servicios de terceros que
no podemos modificar.
Cambiar de un servicio a otro sera tan sencillo como cambiar en el mdulo de nuestra
aplicacin del mdulo BBVA a Santander.
Usando servicios
La primera caracterstica de los servicios es que tienen un nombre (al igual que los
controladores) y como ya dijimos en Espacio de nombres dicho nombre es
independiente del mdulo en el que fueron aadidos. As que para usar un servicio slo
necesitamos saber su nombre.
Continuando ahora con nuestro ejemplo del seguro mdico vamos a aadir un mensaje
de log cuando se configura el $scope.
script.js
1 var app=angular.module("app",[]);
2
app.controller("SeguroController",function($scope,$log) {
3
$scope.seguro={
4
nif:"",
5
nombre:"",
6
ape1:"",
7 edad:undefined,
8 sexo:"",
9 casado:false,
10 numHijos:undefined,
embarazada:false,
11
coberturas: {
12
oftalmologia:false,
13
dental:false,
14
fecundacionInVitro:false
15
},
16 enfermedades:{
17 corazon:false,
18 estomacal:false,
rinyones:false,
19
alergia:false,
20
nombreAlergia:""
21
},
22
fechaCreacion:new Date()
23 }
24
27});
28
29
30
Lnea 3: Vemos que la funcin del controlador ahora tiene 2 parmetros, el $scope y
el $log.
Lnea 28: Usamos el objeto $log llamando al mtodo debug.
Es decir que en vez de pedir nosotros las instancias de los servicios, se incluyen como
parmetros de nuestra funcin del controlador y cuando AngularJS llame al controlador
nos inyectar las instancias de los servicios que hemos solicitado.
Minimizando el JavaScript
?
app.controller("SeguroController",function(a,b) {
1
});
2
Tras minimizar el cdigo, los parmetros se llamaran a y b por lo que AngularJS nos
dir que no conoce ningn servicio llamado a ni ningn servicio llamado b y fallar
nuestro cdigo.
Los creadores de AngularJS conocedores de este problema han creado una solucin. En
vez de pasar la funcin , pasamos un array en el que los n primeros elementos son
Strings con el nombre de los servicios a inyectar y el ltimo parmetro del array ser
la propia funcin.
?
app.controller("SeguroController",['$scope','$log',function($scope,$l
1
og) {
2}]);
Vemos cmo se pasa un array con 3 elementos. El primero de ellos es un String con el
texto $scope , el segundo parmetro es otro String con el texto $log y el tercer
parmetro es la propia funcin.
Ntese que ahora hay que cerrar el corchete del array al acabar la funcin
1app.controller("SeguroController",['$scope','$log',function(a,b) {
2}]);
Es decir que el texto de cada elemento del array 2) se corresponde con el nombre de lo
que queremos inyectar en la funcin del controlador.
script.js
1
var app=angular.module("app",[]);
2
3
app.controller("SeguroController",['$scope','$log',function($scope,$l
4 og) {
$scope.seguro={
5
nif:"",
6
nombre:"",
7
ape1:"",
8
edad:undefined,
9 sexo:"",
1 casado:false,
0
numHijos:undefined,
1
embarazada:false,
1
coberturas: {
1
oftalmologia:false,
2
dental:false,
1
3 fecundacionInVitro:false
1 },
4 enfermedades:{
1 corazon:false,
5 estomacal:false,
1 rinyones:false,
6
alergia:false,
1
nombreAlergia:""
7
},
1
8 fechaCreacion:new Date()
}
1
9
2 }]);
1
2
2
2
3
2
4
2
5
2
6
2
7
2
8
2
9
3
0
Lnea 3: Ahora vemos que se pasa el array con el nombre de las instancias a inyectar y
como ltimo parmetro la propia funcin.
Lnea 30: Tambien hay que cerrar el array con el ]
Recuerda cerrar el array con ] despus de cerrar la funcin con } y por ltimo la llamada a
la funcin controller con ).
Para explicar el servicio de $http vamos a seguir con nuestro ejemplo del seguro
mdico en el que vamos a obtener unos datos iniciales del seguro desde el servidor para
mostrarlos en el formulario. Los datos se obtienen en formato JSON desde la url
datos.json. Este fichero contendr simplemente texto en formato JSON para que
podamos obtener la informacin del servidor. Ms adelante en el curso, obtendremos
los datos mediante REST desde la base de datos , pero por ahora y para aprender a usar
$http ser simplemente un fichero esttico.
?
datos.json
1
2
3 {
"nif":"12345678Z",
4
"nombre":"Carlos",
5 "ape1":"Cano",
6 "edad":41,
7 "sexo":"H",
8 "casado":true,
"numHijos":3,
9 "embarazada":false,
10 "coberturas": {
11 "oftalmologia":true,
12 "dental":false,
13 "fecundacionInVitro":false
},
14 "enfermedades":{
15 "corazon":true,
16 "estomacal":false,
17 "rinyones":false,
"alergia":true,
18 "nombreAlergia":"Acaros"
19 }
20}
21
22
No est el campo fechaCreacion ya que las fechas son un tema complejo que
trataremos ms adelante.
La instancia
Lo primero que tenemos que hacer es obtener una referencia al servicio $http. Como
ya hemos explicado en el tema anterior, tenemos que incluirlo como parmetro de
nuestro controlador para que nos lo inyecte al crearlo.
?
script.js
1var app=angular.module("app",[]);
2
app.controller("SeguroController",['$scope','$log','$http',function($s
3cope,$log,$http) {
4
5
6}]);
Lnea 3: Vemos cmo ahora se inyecta el nuevo servicio , $http. Fjate hemos
puesto el nombre del servicio como parmetro de la funcin y como tercer
parmetro del array.
config
$http acepta como parmetro un nico objeto llamado config con todas las propiedades
que necesita para la peticin.
method: El mtodo HTTP para hacer la peticin. Sus posibles valores son: GET,
POST, PUT, DELETE, etc.
url: La URL de donde queremos obtener los datos.
data: Si usamos el mtodo POST o PUT aqu pondremos los datos a mandar en el
body de la peticin HTTP
params: Un objeto que se pondr como parmetros de la URL.
El objeto config contiene mas propiedades pero no vamos a explicarlas en este curso.
Puedes ver la lista completa en $http Usage
Ahora vamos a hacer una llamada mediante GET a la URL datos.json y sin
parmetros.
?
script.js
var app=angular.module("app",[]);
1
2app.controller("SeguroController",['$scope','$log','$http',function($s
3cope,$log,$http) {
var config={
4 method:"GET",
5 url:"datos.json"
6 }
7
8}]);
9
respuesta
Teniendo el objeto config ya podemos llamar al servicio $http. La llamada nos
retornar un objeto response.
?
script.js
1
2 var app=angular.module("app",[]);
3
4 app.controller("SeguroController",['$scope','$log','$http',function($
5 scope,$log,$http) {
6 varmethod:"GET",
config={
7 url:"datos.json"
8 }
9
1 var response=$http(config);
0
1 }]);
1
No hemos mostrado el resto de lneas del controlador para mejorar la legibilidad
Realmente no nos responde con un objeto response sino con un objeto promise pero ya
veremos ms adelante en el curso los objetos promise.
Los datos
Si todo ha funcionado correctamente podremos obtener el objeto JavaScript
correspondiente al String JSON que nos han pasado. Para ello llamaremos a la funcin
success(fn) que acepta como nico parmetro una funcin nuestra que ser llamada
cuando se obtengan los datos.
Recuerda que headers no es un objeto con la cabeceras sino una funcin que permite
obtener el valor de una cabecera.
?
script.js
1
2
3
4 var app=angular.module("app",[]);
5
6 app.controller("SeguroController",['$scope','$log','$http',function($
7 scope,$log,$http) {
8 var config={
9 method:"GET",
url:"datos.json"
1 }
0
1 var response=$http(config);
1
1 response.success(function(data, status, headers, config) {
2 $scope.seguro=data;
1 });
3
}]);
1
4
1
5
No hemos mostrado el resto de lneas del controlador para mejorar la legibilidad
La lnea 12 tiene mucha ms importancia de la que parece, slo que AngularJS nos lo
hace todo muy sencillo. Como ya hemos dicho, el parmetro data contiene el objeto
con los datos del servidor. Al asignrselo a la propiedad $scope.seguro modificamos
nuestro modelo de datos por lo que automticamente se modificarn los tag <input> de
la pgina HTML ya que el formato del objeto es exactamente el mismo que el que
tenemos en $scope.seguro.
El que se actualice automticamente el modelo es lo que hace que tengamos que usar
$http. Si hubiramos usado directamente el objeto XMLHttpRequest o el mtodo
ajax() de JQuery , AngularJS no se habra enterado de los cambios y no se habra
actualizado la pgina HTML.
Recuerda que la llamada a nuestra funcin de la lnea 11 se hace de forma asncrona tal
y como se hacen las peticiones AJAX
El error
Si ocurre algn error, es decir si se retorna un 400, 500 ,etc, no se llamar a la funcin
de success .Para poder controlar el error debemos llamar a una nuev funcin llamada
error(fn) que al igual que success acepta como nico parmetro una funcin la cual
tiene los mismos argumentos que success.
No vamos a extendernos mas en esta funcin ya que funciona igual que success.
?
script.js
1
2
3
4
5
6 var app=angular.module("app",[]);
7
8 app.controller("SeguroController",['$scope','$log','$http',function($
9 scope,$log,$http) {
var config={
1 method:"GET",
0 url:"datos.json"
1 }
1
1 var response=$http(config);
2
1 response.success(function(data, status, headers, config) {
$scope.seguro=data;
3 });
1
4 response.error(function(data, status, headers, config) {
1 alert("Ha fallado la peticin. Estado HTTP:"+status);
5 });
1
6
1 }]);
7
1
8
1
9
2
0
No hemos mostrado el resto de lneas del controlador para mejorar la legibilidad
Hacer un alert no es la mejor forma de tratar los errores pero a efectos de aprender lo
vamos a poner as.
Un detalle a comentar antes es que las funciones success o error retornan el mismo
objeto response , con lo que podemos concatenar las llamadas.
?
script.js
1
2
3
4 var app=angular.module("app",[]);
5
6 app.controller("SeguroController",['$scope','$log','$http',function($
7 scope,$log,$http) {
8
9 $http({
1 method: 'GET',
url: 'datos.json'
0 }).success(function(data, status, headers, config) {
1 $scope.seguro=data;
1 }).error(function(data, status, headers, config) {
1 alert("Ha fallado la peticin. Estado HTTP:"+status);
});
2
1
3
}]);
1
4
1
5
No hemos mostrado el resto de lneas del controlador para mejorar la legibilidad
Ejemplo
Finalmente el controlador completo quedara de la siguiente forma:
?
script.js
1
var app=angular.module("app",[]);
2
3 app.controller("SeguroController",['$scope','$log','$http',function($
4 scope,$log,$http) {
5 $scope.seguro={
6 nif:"",
7 nombre:"",
ape1:"",
8 edad:undefined,
9 sexo:"",
1 casado:false,
0 numHijos:undefined,
embarazada:false,
1 coberturas: {
1 oftalmologia:false,
1 dental:false,
2 fecundacionInVitro:false
1 },
enfermedades:{
3 corazon:false,
1 estomacal:false,
4 rinyones:false,
1 alergia:false,
nombreAlergia:""
5 },
1 fechaCreacion:new Date()
6 }
1
7 $log.debug("Acabamos de crear el $scope");
1
8 $http({
method: 'GET',
1 url: 'datos.json'
9 }).success(function(data, status, headers, config) {
2 $scope.seguro=data;
0 }).error(function(data, status, headers, config) {
2 alert("Ha fallado la peticin. Estado HTTP:"+status);
});
1
2 }]);
2
2
3
2
4
2
5
2
6
2
7
2
8
2
9
3
0
3
1
3
2
3
3
3
4
3
5
3
6
3
7
3
8
3
9