Académique Documents
Professionnel Documents
Culture Documents
ndice de contenido
1 Por qu un framework JavaScript?..................................................................................................5
2 Por qu AngularJS?..........................................................................................................................6
3 Comenzando la Aplicacin................................................................................................................7
4 Creando nuestra aplicacin desde abajo. Los Servicios..................................................................10
5 Sistema de rutas...............................................................................................................................12
6 Controladores..................................................................................................................................16
7 Directivas.........................................................................................................................................23
8 Filtros...............................................................................................................................................25
9 Testing.............................................................................................................................................27
10 Resumen........................................................................................................................................30
En el sptimo captulo se vern los filtros, componentes con los que podremos
aislar cierta lgica de presentacin.
Para seguir este libro se presupone que sabes JavaScript, HTML y has hecho
algo de desarrollo web.
Para que puedas ver las cosas de primera mano sin picarte todo el cdigo (aunque
se aprende ms), tienes a tu disposicin este repositorio de Github. Cada
captulo est tageado, de forma que puedas ver lo que se hace de un paso a otro
sin problemas. En el tercer captulo te explicar como conseguir el cdigo.
Si eres nuevo con esto de los frameworks JavaScript, te recomiendo que vayas
Tendrs que tener instalado Node.js y Git, as como saber abrir una terminal.
Para instalar Node.js puedes usar este tutorial.
Frameworks JavaScript
Alguna vez has hecho una aplicacin web y has metido JavaScript, (normalmente con
jQuery) para lograr esa interactividad y rapidez?
Si lo has hecho, y has tenido que seguir metiendo ms y ms JavaScript en tu aplicacin,
habrs notado que, o lo haces con cuidado, o se puede convertir en un horror de cdigo.
Esta situacin est cambiando poco a poco y ahora tenemos herramientas que nos
permiten organizara muy bien el cdigo de aplicaciones JavaScript.
Una de estas herramientas son los frameworks JavaScript. Nos permiten crear una Web
App con un patrn MVC o similar teniendo nuestro cdigo organizado.
Si quieres subirte al carro, aprender AngularJS te ayudar.
Vamos a ello!
Por qu AngularJS?
Hay muchos frameworks JavaScript. Tantos que es imposible conocerlos todos. Algunos
de los ms conocidos son Ember, Backbone (este es ms una biblioteca que un
framework), ExtJS, Dojo... y por supuesto AngularJS.
Por qu AngularJS?
Muy opinionado. Esto es bueno o malo segn se mire. Opinionado (mi traduccin
libre de opinionated :D ) es que tiene una manera muy marcada de hacer las
cosas. Tiene mucha magia pero pierdes flexibilidad. Si te gusta y se adapta a lo
que quieres hacer, perfecto. Si no, mejor que hagas las cosas de otra forma.
En general, por la experiencia que tengo AngularJS puede funcionar bien con
muchos tipos de proyectos, pero est pensado para aplicaciones que trabajan ms
con datos que con grficos. Es ideal para aplicaciones CRUD ( Create, retrieve,
update, delete) clsicas.
3 Comenzando la Aplicacin
Para el propsito de este minilibro vamos a hacer una aplicacin muya bsica de
personajes de Dragon Ball :D. Yo he partido de una aplicacin vaca creada con este
generador de Yeoman.
Si no conoces Yeoman, te invito a que le eches un vistazo. A m me encanta. Te monta un
proyecto bsico con un solo comando. Para hacer prototipos es de lo ms til.
La aplicacin que haremos quedar as:
npminstall
bowerinstall
Si todo funciona como debiera, tendrs todo listo para trabajar. Para ejecutar un servidor
de pruebas escribe lo siguiente:
gruntserve
Hemos agregado los datos en forma de un fichero data.json en una carpeta data.
En este caso nuestra base de datos ser un simple fichero, pero la mecnica es igual para
conectar a una API REST.
Veamos el contenido de nuestro fichero services.js.
Como ves, la forma de definir nuestros servicios es como un nuevo mdulo AngularJS
llamado dbzDb.services. La sintaxis es bastante fea en mi opinin, pero es as.
Dentro de este mdulo, creamos una factory. Una factory es un tipo de servicio.
AngularJS ofrece varios tipos de servicios: factory, service y provider. El ms sencillo es
la factora , que nos provee un simple objeto JavaScript y es que el que utilizaremos aqu.
Cuando lo utilicemos nos retornar un objeto como el que ves arriba. En este caso
nuestra factora nos devuelve un objeto que tiene un mtodo list, con el que listaremos
a nuestros personajes de Dragon Ball, provenientes de un fichero JSON que hace las
veces de base de datos.
Como la operacin list tiene que ir a buscar un fichero y devolver su contenido,
necesitamos algo que nos permita hacerlo. Para ello inyectamos la dependencia $http,
que nos permite realizar peticiones HTTP a recursos externos. Es el equivalente de
AngularJS al tradicional $.ajax de jQuery.
La sintaxis es siempre igual.
1. Declarar un mdulo, con sus dependencias entre los corchetes.
2. Declarar los componentes que nos provee este mdulo (servicio, factora,
controlador...). A su vez con sus dependencias.
Por ltimo, tenemos que indicar que nuestra aplicacin dbzDb va a depender de este
mdulo, por tanto lo indicaremos en el fichero app.js, de este modo.
Con esto tenemos todo lo que necesitamos para recuperar la informacin de la base de
datos, en este caso un simple fichero JSON.
Ms adelante veremos cmo utilizar este servicio. A continuacin veremos el sistema de
rutas, con el que crearemos diferentes vistas y haremos la navegacin entre ellas.
5 Sistema de rutas
La mayora de frameworks nos permiten definir rutas en la URL que se asocian a
diferentes vistas. AngularJS no es diferente.
En nuestra mini aplicacin de Dragon Ball vamos a tener las siguientes rutas.
/
/:id una pgina de detalle para una personaje con determinado ID.
Cambios:
Hemos agregado alguna info extra a nuestros datos en el JSON. Irrelevante para
este captulo.
Tenemos una carpeta nueva, partials. Contiene los HTML de las diferentes vistas
de nuestra aplicacin. Una para el listado y otra para el detalle de un personaje.
Podis ver que ahora tenemos una pequea barra de navegacin en la etiqueta nav. Y lo
ms importante, hemos incluido un div con una directiva ng-view. Qu quiere decir
esto? Pues muy sencillo. Que las vistas que vayamos poniendo se irn cargando dentro
de este ng-view.
Por ltimo, para que las rutas funcionen, hay que agregar una dependencia nueva. sta
va en un fichero aparte de AngularJS, angular-route.js.
Ms cosillas. Las rutas las configuramos en el fichero app.js, que de momento presenta
este aspecto.
Por ltimo, en caso de introducir una URL que no cuadre con ninguno de esos dos
patrones, nos redirigir a /.
De esta forma, ahora tenemos una pgina tal que as (ten en cuenta que todos las
imgenes y dems estn hardcodeados) :
La cosa va avanzando, verdad? Ahora slo tenemos que cargar los datos de nuestros
personajes del JSON y cambiar el HTML de acuerdo a los mismos. En los siguientes
captulos lo haremos.
6 Controladores
Los controladores de AngularJS se utilizan para manejar los datos que se van a mostrar
en las vistas. Se encarga, junto con el objeto $scope, de mantener los datos de la vista.
Se entiende mucho mejor con el ejemplo. En nuestra aplicacin vamos a crear dos
controladores. Uno para la lista y otro para el detalle.
Nos situamos en el tag cap6.
gitcheckoutcap6
Las novedades:
Hemos cambiado nuestros HTML para que trabajen con datos proporcionados por
los controladores.
A partir de ah salen dos controllers. Uno para el listado, otro para el detalle.
Ya sabemos cmo funcionan los controladores. Ahora veremos cmo se relacionan con
las vistas. Ello est en app.js.
Por ltimo. Cmo se usan los datos que nos proporciona $scope en las vistas? Muy
simple, con un pequeo lenguaje de plantillas.
Veamos la vista partials/list.html.
ng-repeat: esta pequea directiva nos permite repetir cdigo HTML tantas veces
como lo indique en un array. En este caso hemos puesto:
<divclass="row"ngrepeat="rowinrows">
</div>
Aqu queremos decir que repita la div tantas veces como longitud tenga el array
rows. En la prctica, aqu tendremos 3 divs con la class row.
Tenemos un segundo ng-repeat, anidado con el anterior, de la siguiente forma:
<div class="collg3" ngrepeat="char in characters.slice(row *
4,4+(row*4))">
</div>
Este es un poco ms raro, pero la mecnica es igual. Lo que queremos hacer es que nos
represente unos cuantos personajes en cada fila, en concreto 4 personajes por fila. Para
ello cogemos una porcin del array de personajes de acuerdo a la fila en la que estemos.
Por ejemplo, en la fila 0 cogemos los personajes de 0 a 3, en la fila 1 del 4 al 7 etc...
Pero lo importante de esto es que veas cmo dentro de los ng-... podemos usar
partials/detail.html
directivas y los filtros. Y por supuesto el testing. Lo dejamos para los siguientes captulos.
No es necesario utilizar las rutas para poder usar controladores. Puedes hacer una
aplicacin AngularJS sencilla con tan slo un controlador (o los que quieras), y
hacer que maneje una porcin de tu aplicacin indicndolo en el HTML, as:
<divngcontroller=miControlador>
{{variable}}
</div>
Dentro de ese div, puedes utilizar variables del $scope dentro de tu controlador, y
estarn aisladas del resto de la aplicacin.
7 Directivas
Las directivas son una de las partes ms poderosas de AngularJS. Nos permiten crear
nuevos elementos HTML cargados de funcionalidad, totalmente independientes del resto
de la aplicacin.
Ya hemos usado directivas en varias ocasiones. Cada vez que ves en HTML ng-algo ests
utilizando una directiva. Hay directivas muy tiles proporcionadas por AngularJS, pero
podemos crear las nuestras propias.
Vamos a ver cmo crear una directiva.
gitcheckoutcap7
En este caso hemos creado una directiva para evitar repetir el cdigo del panel donde
aparece la imagen del personaje. Para ello:
Finalmente, hemos sustituido toda la etiqueta div... del personaje por una nueva
etiqueta html <char-card></char-card>.
Como veis, hemos creado un nuevo mdulo para las directivas, y hemos creado una
directiva charCard, que podemos utilizar as:
La directiva retorna un objeto que puede tener varios atributos. Aqu tenemos:
restrict: indica si la directiva ser un elemento HTML (E), un atributo (A) o clase (C).
Existen otros atributos, como link, controller o scope, por si se quiere agregar un
controlador y un scope independientes... etc. Lo mejor es que si quieres crear directivas
ms completas consultes la referencia en https://docs.angularjs.org/guide/directive
ng-if: renderiza HTML dependiendo de una condicin (un atributo del scope, por
ejemplo). P ej:
<divngif=mostrar></button>
ng-class: asigna una clase CSS al elemento que la contenga dependiendo de una
condicin. P ej:
<div ngclass={'miclase': condicion, 'miotraclase':
condicion2}></button>
ng-model: enlaza un atributo del scope con un input, un textarea etc. Cuando el
usuario modifique el valor, este se actualiza automticamente en el scope (y en los
sitios en que aparezca).
<inputngmodel=nombretype=text></input>
Aparte de estas y todas las dems directivas que proporciona AngularJS, existen multitud
de mdulos creados por terceros que nos proporcionan componentes HTML en forma de
directivas: http://ngmodules.org/
8 Filtros
El ltimo de los elementos de AngularJS que vamos a ver son los filtros. Los filtros se
usan para dar formato a valores. Por ejemplo, podemos tener un filtro al que le pasemos
una cadena y nos la devuelva en maysculas. Pueden usarse en vistas, controladores,
servicios...
En nuestra aplicacin vamos a hacer dos cosas:
1. Crear un filtro para que el powerlevel de los personajes se ponga en formato (1k,
2k, etc.).
2. Utilizar un filtro de AngularJS para poner los nombres de los personajes en
mayscula.
gitcheckoutcap8
Los cambios en este caso son:
Como veis, un filtro devuelve una funcin que transforma un valor de entrada.
Para su uso, en una vista, es tan simple como lo siguiente:
uppercase
orderBy
json
date
9 Testing
AngularJS pone un gran nfasis en el testing. Gracias a la tcnica de inyeccin de
dependencias, podemos aislar suficientemente cada parte de nuestra aplicacin para
que podamos realizar un testeo automatizado fcilmente. Si no has hecho nunca testing,
es probable que muchas de las palabras que utilice te suenen a chino.
Bsicamente el testing es escribir cdigo para probar nuestro cdigo. Esto es til, por
ejemplo, si otra persona va a modificar tu cdigo, para que pueda aadir cosas
asegurndose de que no se rompe nada.
En este captulo te mostrar las herramientas que necesitas para ponerte con el testing.
AngularJS est preparado para realizar tests unitarios y e2e ( end to end). En este captulo
realizamos una introduccin a los tests unitarios, que son los ms sencillos.
Para que el testeo sea ms ameno los chicos de AngularJS crearon Karma (anteriormente
conocido como testacular, y cuyo nombre cambiaron por razones obvias :P).
Karma es una herramienta que nos permite ejecutar nuestros test con varios
navegadores de forma automtica.
Para instalarlo:
npminstallkarmaclig
Para trabajar, Karma utiliza un fichero de configuracin, en el que hay que indicarle las
rutas de nuestros ficheros JavaScript, el framework de testing que vamos a usar,
formatos de reporte, navegadores...
En nuestro repositorio ya lo tenemos hecho, as que ponte en el tag cap9.
gitcheckoutcap9
Como ves, estn comentadas y son bastante autoexplicativas. Karma coge todos los JS
que se definen en files y los inyecta en el navegador que le digis. Si quieres que los test
se ejecuten sin abrir ninguna ventana, puedes utilizar PhantomJS como navegador, pero
si tienes que depurar algn test es ms til abrirlo con Firefox o Chrome y utilizar sus
herramientas de desarrollo.
El contenido de test/services.js es el siguiente:
Aqu estamos usando el framework de test Mocha. Podis usar cualquier otro, es
indiferente.
Bsicamente creamos bloques con la palabra describe y los test concretos dentro de it.
Esta sintaxis es propia de BDD, behaviour driven development. Desarrollo dirigido por
comportamientos. Primero describimos un componente y luego cosas que debera
hacer. Es casi como si escribiramos: el servicio Dbz debe llamar al backend y recuperar
una lista de personajes.
Lo importante aqu son las lneas de module, que instancia nuestro mdulo de servicios.
Est dentro de un beforeEach, que lo invoca antes de cualquier test.
Despus, dentro del it, utilizamos la funcin inject para inyectar las dependencias que
vamos a testear, en este caso DbzData. Adems inyectamos $httpBackend, que sirve
para interceptar llamadas a un backend y retornar lo que queramos.
Estas funciones, inject y $httpBackend, estn definidas dentro del fichero angularmocks.js, que hemos incluido para hacer los test.
10 Resumen
Esto son los conceptos fundamentales que hemos visto:
Y con esto hemos acabado el mini-curso de AngularJS! Espero que te haya resultado til.
Recuerda que en JSjutsu podrs encontrar ms material til sobre web y JS.
Nos vemos en el blog!