Ahora que ya tenemos un conocimiento inicial de angular , ya podemos empezar a hacer un ejemplo un poco más real.El objetivo de este tema es crear un formulario (AngularJS tiene muchas más funcionalidades relativas a formularios que veremos más adelante) que permita la entrada de datos de un hipotético seguro médico.
Ya hemos visto la importancia del modelo de datos para AngularJS así que vamos a definir nuestro modelo del ejemplo del seguro médico:
<!DOCTYPE html> <html ng-app="app"> <head> <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.19/angular.min.js"></script> <script src="script.js"></script> </head> <body ng-controller="SeguroController"> <form> <fieldset> <legend>Seguro Médico</legend> <label for="nif">NIF:</label><input id="nif" name="nif" type="text" ng-model="seguro.nif" /><br> <label for="nombre">Nombre:</label><input id="nombre" name="nombre" type="text" ng-model="seguro.nombre" /><br> <label for="ape1">1º Apellido:</label><input id="ape1" name="ape1" type="text" ng-model="seguro.ape1" /><br> <label for="edad">Edad:</label><input id="edad" name="edad" type="text" ng-model="seguro.edad" /><br> <label for="sexo">Sexo:</label><select id="sexo" name="sexo" type="checkbox" ng-model="seguro.sexo" ><option value="">--Elige opcion--</option><option value="H">Hombre</option><option value="M">Mujer</option></select><br> <label for="casado">Casado:</label><input id="casado" name="casado" type="checkbox" ng-model="seguro.casado" /><br> <label for="numHijos">Nº Hijos:</label><input id="numHijos" name="numHijos" type="text" ng-model="seguro.numHijos" /><br> <label for="embarazada">Embarazada:</label><input id="embarazada" name="embarazada" type="checkbox" ng-model="seguro.embarazada" /><br> <label for="fechaCreacion">Fecha de creación:</label><input id="fechaCreacion" name="fechaCreacion" type="text" ng-model="seguro.fechaCreacion" /><br> </fieldset> <fieldset> <legend>Coberturas</legend> <label for="oftalmologia">Oftalmologia:</label><input id="oftalmologia" name="oftalmologia" type="checkbox" ng-model="seguro.coberturas.oftalmologia" /><br> <label for="dental">Dental:</label><input id="dental" name="dental" type="checkbox" ng-model="seguro.coberturas.dental" /><br> <label for="fecundacionInVitro">Fecundacion In Vitro:</label><input id="fecundacionInVitro" name="fecundacionInVitro" type="checkbox" ng-model="seguro.coberturas.fecundacionInVitro" /><br> </fieldset> <fieldset> <legend>Enfermedades</legend> <label for="corazon">Corazon:</label><input id="corazon" name="corazon" type="checkbox" ng-model="seguro.enfermedades.corazon" /><br> <label for="estomacal">Estomacal:</label><input id="estomacal" name="estomacal" type="checkbox" ng-model="seguro.enfermedades.estomacal" /><br> <label for="rinyones">Riñones:</label><input id="rinyones" name="rinyones" type="checkbox" ng-model="seguro.enfermedades.rinyones" /><br> <label for="alergia">Alergia:</label><input id="alergia" name="alergia" type="checkbox" ng-model="seguro.enfermedades.alergia" /><br> <label for="nombreAlergia">Nombre de la alergia:</label><input id="nombreAlergia" name="nombreAlergia" type="text" ng-model="seguro.enfermedades.nombreAlergia" /><br> </fieldset> </form> </body> </html>
<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”.<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.* Línea 19: Vemos cómo la fecha se muestra en formato inglés. Este problema ya lo arreglaremos más adelante ya que el tratamiento de fechas no es sencillo.
var app=angular.module("app",[]); function SeguroController($scope) { $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
sino que creamos un nuevo objeto con las propiedades de nuestro modelo y éste se asigna al $scope
.alergia
tendrás que escribir:
$scope.seguro.enfermedades.alergia
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 heredarán de tu $scope
y si pones las propiedades directamente en el $scope
fallarán en ciertos casos y te costará descubrir qué ha pasado.
En el ejemplo anterior todos las propiedades de la directiva ng-model
empiezan por “seguro.” , es decir, que siempre llevan un “punto”, por lo que es correcto.
Lo que estaría mal sería haber hecho:
$scope.nif="";
En ese caso la directiva ng-model
tiene el valor “nif”, es decir que NO tendría punto, por lo que sería incorrecta.
ngOption
para evitar poner manualmente los tags <option>
.