Una introducción a AngularJS. Presentación base de una charla/curso para Intel, Costa Rica. Marzo del 2014. Presenta una introducción a los conceptos principales para empezar a utilizar AngularJS en el desarrollo de aplicaciones Web.
1. HTML enhanced for web apps!
Ing. Leopoldo Rojas Moguel, MBA
leopoldo.rojas@arckanto.com
2. Agenda: Día 1
1. Introducción a AngularJS
2. Single-page apps (SPA)
3. Características generales de AngularJS
4. Conceptos y fundamentos en AngularJS
5. Algunas directivas principales de AngularJS
6. ¿Qué es AngularJS?
Es un framework de javascript para crear aplicaciones web
dinámicas, el cual utiliza el HTML como mecanismo de lenguaje
de template de las aplicaciones y permite extender el lenguaje
base de HTML para representar los distintos componentes de la
aplicación.
“Es lo que el HTML hubiera sido, si hubiera sido diseñado para crear
aplicaciones web”
AngularJS Team
9. ¿Qué es entonces AngularJS?
• Un framework de javascript
• Es tecnología server-agnostic ya que todo lo ejecuta del lado
del browser
• Intenta definir el comportamiento de la aplicación mediante
nuevas “construcciones” dentro del HTML mismo
• Define lineamientos claros de cómo estructurar una aplicación
web (client-side)
• Orientado a aplicaciones web CRUD
10. La filosofía base de AngularJS
• Desacoplar la manipulación del DOM de la lógica de la
aplicación (Presentation vs Business Logic)
• Desacoplar la lógica de la aplicación del lado del cliente, de la
lógica de la aplicación del lado del servidor
• El framework debe guiar a los Developers en cómo ir
estructurando los diferentes componentes de una aplicación
client-side
• Le otorga mucha importancia a las pruebas (TDD y Testing-
ready)
11. ¿Para qué NO es AngularJS?
• No es una tecnología de aplicaciones Web del lado del
servidor, sino que debe complementarse con una de ellas
• No es óptima para aplicaciones con alta manipulación del
DOM del browser, tales como los juegos o los editores de
textos
• No depende de jQuery (aunque puede utilizarse y son
perfectamente compatibles) y no intenta competir con los
problemas que jQuery resuelve adecuadamente
(manipulación detallada del DOM del browser)
14. Single-page Apps (SPAs)
• Una aplicación web que está conformada por una sola página
HTML
• La aplicación se carga en una sola llamada al server
• No es necesario refrescar la página para ir utilizando la aplicación
• No se transfiere el control a ninguna otra página
• Provee una experiencia similar a las aplicaciones desktop-only
15.
16. Inicialización y Data-binding
<!doctype html>
<html ng-app>
<head>
<script src="angular.min.js"></script>
</head>
<body>
<div>
<label>What do you think about AngularJS:</label>
<input type="text" ng-model="angularIMHO" placeholder="Please, tell us">
<hr>
<h1>{{angularIMHO}}</h1>
</div>
</body>
</html>
17. Controladores y directivas
<body>
<h2>Teams in World Cup Brazil 2014</h2>
<div ng-controller="TeamsCtrl">
<span>{{remaining()}} with possibilities to be champion, of {{teams.length}} teams</span>
[ <a href="" ng-click="restart()">Restart only with classified teams</a> ]
<ul class="unstyled">
<li ng-repeat="team in teams">
<input type="checkbox" ng-model="team.eliminated">
<span class="reject-{{team.eliminated}}">{{team.name}}</span>
</li>
</ul>
<form ng-submit="addTeam()">
<input type="text" ng-model="teamName" size="30"
placeholder="add new team here">
<input class="btn-primary" type="submit" value="add">
</form>
</div>
</body>
24. Lo usual para AngularJS
• Browser reciente (Chrome, Safari, Firefox, IE9+)
• Servidor web
• Editor de Texto (ejemplo: SublimeText)
• Control de versiones (ejemplo: Git)
• Servicios de BackEnd (p.ej: Base de Datos; Aplicación server-
side con un API RESTful JSON-based)
• Para pruebas (TDD) : Jasmine (javascript) y Karma (Task
runner)
31. Rutas y Deep Linking
Fuente: Dan Wahlin Blog - http://weblogs.asp.net/dwahlin/
32.
33. Principales Directivas en AngularJS
ngApp ngSrc ngDisabled ngModel
ngChange ngController ngClick ngRepeat
ngShow ngHide ngClass ngSubmit
ngInit …
34. Principales Directivas en AngularJS
ngApp ngSrc ngDisabled ngModel
ngChange ngController ngClick ngRepeat
ngShow ngHide ngClass ngSubmit
ngInit …
35. ngInit
<body>
<h1>World Cup Brasil 2014</h1>
<div>
<label>Which team will win the group D?</label>
<p>Costa Rica</p>
</div>
<div ng-init="firstTeam = 'Costa Rica' ">
<table>
<tr><td>{{firstTeam}}</td></tr>
<tr><td>England</td></tr>
<tr><td>Italy</td></tr>
<tr><td>Uruguay</td></tr>
</table>
</div>
</body>
ngInit evalúa una
expresión en el
scope actual
36. Principales Directivas en AngularJS
ngApp ngSrc ngDisabled ngModel
ngChange ngController ngClick ngRepeat
ngShow ngHide ngClass ngSubmit
ngInit …
37. ngChange
<div>
<input type="checkbox" ng-model="costaRica" ng-change="change()" id="ng-
change-example1" />
<input type="checkbox" ng-model="costaRica" id="ng-change-example2" />
<label for="ng-change-example2">Costa Rica?</label><br />
<tt>Costa Rica? = {{costaRica}}</tt><br/>
<tt>Cambios de opinion? = {{counter}}</tt><br/>
</div>
</body>
<script>
function Controller($scope) {
$scope.counter = 0;
$scope.change = function() {
$scope.counter++;
};
}
</script>
ngChange evalúa
una expresión
cuando el usuario
cambio el input
38. Principales Directivas en AngularJS
ngApp ngSrc ngDisabled ngModel
ngChange ngController ngClick ngRepeat
ngShow ngHide ngClass ngSubmit
ngInit …
39. ngShow
<body>
<h1>World Cup Brasil 2014</h1>
<div>
<label>Which team will win the group D?</label>
<p>Costa Rica</p>
</div>
<div>
<table>
<tr><td>Costa Rica</td></tr>
<tr><td>England</td></tr>
<tr><td>Italy</td></tr>
<tr><td>Uruguay</td></tr>
</table>
</div>
<div>
<input type="checkbox" ng-model="costaRica" />
<label>Costa Rica?</label><br />
<tt ng-show="costaRica">Yes! I think Costa Rica will win the group!!</tt>
</div>
</body>
ngShow muestra o
esconde un
elemento dado
dependiendo de la
expresión. Si la
expresión es
verdadera, muestra
el elemento.
40. ngHide
<body>
<h1>World Cup Brasil 2014</h1>
<div>
<label>Which team will win the group D?</label>
<p>Costa Rica</p>
</div>
<div>
<table>
<tr><td>Costa Rica</td></tr>
<tr><td>England</td></tr>
<tr><td>Italy</td></tr>
<tr><td>Uruguay</td></tr>
</table>
</div>
<div>
<input type="checkbox" ng-model="costaRica" />
<label>Costa Rica?</label><br />
<tt ng-hide="costaRica">Mmm... No, I think is some kind of difficult.</tt>
</div>
</body>
ngHide muestra o
esconde un
elemento dado
dependiendo de la
expresión. Si la
expresión es
verdadera, esconde
el elemento.
41. Principales Directivas en AngularJS
ngApp ngSrc ngDisabled ngModel
ngChange ngController ngClick ngRepeat
ngShow ngHide ngClass ngSubmit
ngInit …
42. ngClick
<div ng-init="count=0">
<button ng-click="count = count + 1">
Votes for Costa Rica will win the group
</button>
<br />
<button ng-click="count = count - 1">
Votes for Costa Rica won´t win the group
</button>
<br />
count: {{count}}
</div>
ngClick permite
especificar un
comportamiento
cuando un elemento
es clickeado
43. Principales Directivas en AngularJS
ngApp ngSrc ngDisabled ngModel
ngChange ngController ngClick ngRepeat
ngShow ngHide ngClass ngSubmit
ngInit …
44. ngClass
<p ng-class="{strike: deleted, bold: important, red: alert}">Definitely
Costa Rica!!</p>
<input type="checkbox" ng-model="deleted"> I don't think so (apply
"strike" class)<br>
<input type="checkbox" ng-model="important"> Obvious (apply "bold"
class)<br>
<input type="checkbox" ng-model="alert"> Red Alert (apply "red" class)
<hr>
<p ng-class="style">Usando Strings</p>
<input type="text" ng-model="style" placeholder="Type: bold strike
red">
<hr>
<p ng-class="[style1, style2, style3]">Using Arreglos</p>
<input ng-model="style1" placeholder="Type: bold, strike or red"><br>
<input ng-model="style2" placeholder="Type: bold, strike or red"><br>
<input ng-model="style3" placeholder="Type: bold, strike or red"><br>
ngClass permite colocar clases CSS dependiendo de una expresión: objeto, string o arreglo
45. Principales Directivas en AngularJS
ngApp ngSrc ngDisabled ngModel
ngChange ngController ngClick ngRepeat
ngShow ngHide ngClass ngSubmit
ngInit …
46. ngSrc
Breve correción en el uso del tag <img src=“…” />
Uso normal:
<img src="http://www.oursite.com/{{brazilImg}}"/>
Uso en AngularJS:
<img ng-src="http://www.oursite.com/{{brazilImg}}"/>
47. Principales Directivas en AngularJS
ngApp ngSrc ngDisabled ngModel
ngChange ngController ngClick ngRepeat
ngShow ngHide ngClass ngSubmit
ngInit …
48. ngDisabled
<div ng-init="count=0">
<button ng-disabled="checked" ng-click="count = count + 1">
Votes for Costa Rica will win the group
</button>
<br />
<button ng-disabled="checked" ng-click="count = count - 1">
Votes for Costa Rica won´t win the group
</button>
<br />
count: {{count}}
</div>
<p>Do you want to disable the buttons? <input type="checkbox" ng-
model="checked"></p>
ngDisabled permite deshabilitar botones utilizando expresiones de AngularJS
49. Principales Directivas en AngularJS
ngApp ngSrc ngDisabled ngModel
ngChange ngController ngClick ngRepeat
ngShow ngHide ngClass ngSubmit
ngInit …
50. ngSubmit
<div>
<form ng-submit="submit()" ng-controller="Ctrl">
Enter the teams that you think could win the World Cup and hit enter:
<input type="text" ng-model="text" name="text" />
<input type="submit" id="submit" value="Submit" />
<pre>list={{list}}</pre>
</form>
</div>
<script>
function Ctrl($scope) {
$scope.list = [];
$scope.text = 'Costa Rica';
$scope.submit = function() {
if ($scope.text) {
$scope.list.push(this.text);
$scope.text = '';
}
};
}
</script>
ngSubmit ejecuta
expresiones de
AngularJS cuando un
Form es “enviado” (o
submitted)
51. Principales Directivas en AngularJS
ngApp ngSrc ngDisabled ngModel
ngChange ngController ngClick ngRepeat
ngShow ngHide ngClass ngSubmit
ngInit …
58. AngularJS y una RESTful API
Servicio
$http
• Si el API no es
completamente RESTful
• Otorga más flexibilidad
pero quizá se deba escribir
más código
Servicio
$resource
• Mejor con RESTful APIs
• Viene con el módulo
ngResource
• Métodos de más alto nivel
de abstracción
69. AngularJS y TDD
Pruebas Unitarias:
Jasmine: BDD Framework para javascript
Karma: Ejecuta pruebas (Test Runner)
Pruebas end-to-end
Protractor
•WebDriverJS
70. ¡Muchas Gracias!
Ing. Leopoldo Rojas Moguel, MBA
leopoldo.rojas@arckanto.com
“Me lo contaron y lo olvidé; lo vi y lo entendí; lo hice y lo aprendí”
Confucio