SlideShare ist ein Scribd-Unternehmen logo
1 von 70
HTML enhanced for web apps!
Ing. Leopoldo Rojas Moguel, MBA
leopoldo.rojas@arckanto.com
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
Agenda: Día 2
Creando una aplicación
AngularJS
Agenda: Día 3
1. Integrando AngularJS con servicios de servidor Web
2. Tópicos relacionados con el desarrollo en SPA
3. Wrap-up
Trend Topic - AngularJS
¿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
AngularJS en acción
¿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
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)
¿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)
Framework AngularJS
Templates Directives Modelo Scope
Data Binding
Deep
Linking
Routing Views
Filters Controller
Dependency
Injection
Módulos
Servicios …
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
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>
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>
Controladores y directivas
function TeamsCtrl($scope) {
$scope.teams = [
{name:'Costa Rica', eliminated:false},
{name:'Brazil', eliminated:true}];
$scope.addTeam = function() {
$scope.teams.push({name:$scope.teamName, eliminated:false});
$scope.teamName = '';
};
…
Controladores y directivas
…
$scope.remaining = function() {
var count = 0;
angular.forEach($scope.teams, function(team) {
count += team.eliminated ? 0 : 1;
});
return count;
};
$scope.restart = function() {
var oldTeams = $scope.teams;
$scope.teams = [];
angular.forEach(oldTeams, function(team) {
if (!team.eliminated) $scope.teams.push(team);
});
};
}
Rutas y servicios
.config(function($routeProvider) {
$routeProvider
.when('/', {
controller:'TeamsCtrl',
templateUrl:'3teams.html'
})
.when('/new', {
controller:'CreateCtrl',
templateUrl:'3team.html'
})
.otherwise({
redirectTo:'/'
});
})
Rutas y servicios
.controller('TeamsCtrl', function($scope, Teams) {
$scope.teams = Teams.getTeams();
})
.controller('CreateCtrl', function($scope, $location, Teams) {
$scope.save = function() {
$scope.teams = Teams.includeTeam($scope.team);
$scope.team = {};
$location.path('/');
};
});
Rutas y servicios
.factory('Teams', function($http) {
teams = [
{"name":"Costa Rica", "starPlayer": "Joel Campbell", "site":
"http://www.fifa.com/worldcup/teams/team=43901/index.html"},
{"name":"Brasil", "starPlayer": "Neymar", "site":
"http://www.fifa.com/worldcup/teams/team=43924/index.html"}
];
return {
getTeams: function() {
return teams;
},
includeTeam: function(team) {
return teams.push(team);
}
}
})
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)
Por cierto, ¿qué es MEAN stack?
Data Binding
AngularJSFuente: Sitio Web de AngularJS
Model-View-Controller (MVC)
AngularJS
Fuente: Sitio Web de AngularJS
Arquitectura general de AngularJS
Fuente: Dan Wahlin Blog - http://weblogs.asp.net/dwahlin/
Arquitectura general de AngularJS
Fuente: Dan Wahlin Blog - http://weblogs.asp.net/dwahlin/
Rutas y Deep Linking
Fuente: Dan Wahlin Blog - http://weblogs.asp.net/dwahlin/
Principales Directivas en AngularJS
ngApp ngSrc ngDisabled ngModel
ngChange ngController ngClick ngRepeat
ngShow ngHide ngClass ngSubmit
ngInit …
Principales Directivas en AngularJS
ngApp ngSrc ngDisabled ngModel
ngChange ngController ngClick ngRepeat
ngShow ngHide ngClass ngSubmit
ngInit …
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
Principales Directivas en AngularJS
ngApp ngSrc ngDisabled ngModel
ngChange ngController ngClick ngRepeat
ngShow ngHide ngClass ngSubmit
ngInit …
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
Principales Directivas en AngularJS
ngApp ngSrc ngDisabled ngModel
ngChange ngController ngClick ngRepeat
ngShow ngHide ngClass ngSubmit
ngInit …
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.
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.
Principales Directivas en AngularJS
ngApp ngSrc ngDisabled ngModel
ngChange ngController ngClick ngRepeat
ngShow ngHide ngClass ngSubmit
ngInit …
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
Principales Directivas en AngularJS
ngApp ngSrc ngDisabled ngModel
ngChange ngController ngClick ngRepeat
ngShow ngHide ngClass ngSubmit
ngInit …
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
Principales Directivas en AngularJS
ngApp ngSrc ngDisabled ngModel
ngChange ngController ngClick ngRepeat
ngShow ngHide ngClass ngSubmit
ngInit …
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}}"/>
Principales Directivas en AngularJS
ngApp ngSrc ngDisabled ngModel
ngChange ngController ngClick ngRepeat
ngShow ngHide ngClass ngSubmit
ngInit …
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
Principales Directivas en AngularJS
ngApp ngSrc ngDisabled ngModel
ngChange ngController ngClick ngRepeat
ngShow ngHide ngClass ngSubmit
ngInit …
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)
Principales Directivas en AngularJS
ngApp ngSrc ngDisabled ngModel
ngChange ngController ngClick ngRepeat
ngShow ngHide ngClass ngSubmit
ngInit …
Gran cantidad de Directivas
ngBind, ngBindHtml, ngBindTemplate, ngBlur, ngChange, ngChecked,
ngClass, ngClassEven, ngClassOdd, ngClick, ngCloak, ngController, ngCopy,
ngCsp, ngCut, ngDblclick, ngDisabled, ngFocus, ngForm, ngHide, ngHref,
ngIf, ngInclude, ngInit, ngKeydown, ngKeypress, ngKeyup, ngList, ngModel,
ngMousedown, ngMouseenter, ngMouseleave, ngMousemove,
ngMouseover, ngMouseup, ngNonBindable, ngOpen, ngPaste, ngPluralize,
ngReadonly, ngRepeat, ngSelected, ngShow, ngSrc, ngSrcset, ngStyle,
ngSubmit, ngSwitch, ngTransclude, ngValue
SPA vs Aplicación Web tradicional
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
$http y $resource en AngularJS
$http.get('teams/teams.json').success(function(data) {
teams = data;
$scope.team = teams.filter(function(team){
return team.id == $routeParams.teamId;
})[0];
});
worldCupServices.factory('Team', ['$resource',
function($resource){
return $resource('teams/:teamId.json', {}, {
query: {method:'GET', params:{teamId:'teams'}, isArray:true}
});
}]);
3-way Data Binding
Fuente: Sitio Web de AngularJS
Aplicaciones Móviles
AngularJS y Cordova (aka PhoneGap)
AngularJS más móvil
AngularJS más móvil
Test-Driven Development
AngularJS y TDD
Pruebas Unitarias:
Jasmine: BDD Framework para javascript
Karma: Ejecuta pruebas (Test Runner)
Pruebas end-to-end
Protractor
•WebDriverJS
¡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

Weitere ähnliche Inhalte

Was ist angesagt?

Introducciòn a AngularJS
Introducciòn a AngularJSIntroducciòn a AngularJS
Introducciòn a AngularJSRené Olivo
 
Introducción a Knockout
Introducción a KnockoutIntroducción a Knockout
Introducción a KnockoutOscar Gensollen
 
ASP.NET MVC - layouts y vistas parciales
ASP.NET MVC - layouts y vistas parcialesASP.NET MVC - layouts y vistas parciales
ASP.NET MVC - layouts y vistas parcialesDanae Aguilar Guzmán
 
Introducción a AngularJS
Introducción a AngularJS Introducción a AngularJS
Introducción a AngularJS Marcos Reynoso
 
ASP.Net MVC 3 - Eugenio Serrano
ASP.Net MVC 3 - Eugenio SerranoASP.Net MVC 3 - Eugenio Serrano
ASP.Net MVC 3 - Eugenio SerranoEugenio Serrano
 
Login social con node.js
Login social con node.jsLogin social con node.js
Login social con node.jsCarlos Azaustre
 
ASP.NET MVC - Introducción a ASP.NET MVC
ASP.NET MVC - Introducción a ASP.NET MVCASP.NET MVC - Introducción a ASP.NET MVC
ASP.NET MVC - Introducción a ASP.NET MVCDanae Aguilar Guzmán
 
Componentes en angularjs 1.5
Componentes en angularjs 1.5Componentes en angularjs 1.5
Componentes en angularjs 1.5Hugo Biarge
 
Workshop 7: Single Page Applications
Workshop 7: Single Page ApplicationsWorkshop 7: Single Page Applications
Workshop 7: Single Page ApplicationsVisual Engineering
 
Charla Jquery
Charla JqueryCharla Jquery
Charla Jquerykaolong
 
ASP.NET MVC - introduccion al web api
ASP.NET MVC - introduccion al web apiASP.NET MVC - introduccion al web api
ASP.NET MVC - introduccion al web apiDanae Aguilar Guzmán
 
Hack2Progress - Desarrollando una aplicación web con AngularJS
Hack2Progress - Desarrollando una aplicación web con AngularJSHack2Progress - Desarrollando una aplicación web con AngularJS
Hack2Progress - Desarrollando una aplicación web con AngularJSCarlos Azaustre
 
Ruby On Rails Intro
Ruby On Rails IntroRuby On Rails Intro
Ruby On Rails IntroThirdWay
 
09b jsf (1)
09b jsf (1)09b jsf (1)
09b jsf (1)UTN
 

Was ist angesagt? (20)

Javascript y AJAX en Wordpress
Javascript y AJAX en WordpressJavascript y AJAX en Wordpress
Javascript y AJAX en Wordpress
 
Introducciòn a AngularJS
Introducciòn a AngularJSIntroducciòn a AngularJS
Introducciòn a AngularJS
 
Introducción a Knockout
Introducción a KnockoutIntroducción a Knockout
Introducción a Knockout
 
AngularJS2
AngularJS2AngularJS2
AngularJS2
 
ASP.NET MVC - layouts y vistas parciales
ASP.NET MVC - layouts y vistas parcialesASP.NET MVC - layouts y vistas parciales
ASP.NET MVC - layouts y vistas parciales
 
Introducción a AngularJS
Introducción a AngularJS Introducción a AngularJS
Introducción a AngularJS
 
ASP.Net MVC 3 - Eugenio Serrano
ASP.Net MVC 3 - Eugenio SerranoASP.Net MVC 3 - Eugenio Serrano
ASP.Net MVC 3 - Eugenio Serrano
 
Login social con node.js
Login social con node.jsLogin social con node.js
Login social con node.js
 
ASP.NET MVC - Introducción a ASP.NET MVC
ASP.NET MVC - Introducción a ASP.NET MVCASP.NET MVC - Introducción a ASP.NET MVC
ASP.NET MVC - Introducción a ASP.NET MVC
 
Componentes en angularjs 1.5
Componentes en angularjs 1.5Componentes en angularjs 1.5
Componentes en angularjs 1.5
 
Workshop 7: Single Page Applications
Workshop 7: Single Page ApplicationsWorkshop 7: Single Page Applications
Workshop 7: Single Page Applications
 
Codigos para html
Codigos para htmlCodigos para html
Codigos para html
 
Charla Jquery
Charla JqueryCharla Jquery
Charla Jquery
 
ASP.NET MVC - introduccion al web api
ASP.NET MVC - introduccion al web apiASP.NET MVC - introduccion al web api
ASP.NET MVC - introduccion al web api
 
ASP.NET MVC - AJAX
ASP.NET MVC - AJAXASP.NET MVC - AJAX
ASP.NET MVC - AJAX
 
Hack2Progress - Desarrollando una aplicación web con AngularJS
Hack2Progress - Desarrollando una aplicación web con AngularJSHack2Progress - Desarrollando una aplicación web con AngularJS
Hack2Progress - Desarrollando una aplicación web con AngularJS
 
ASP.NET MVC - validacion de datos
ASP.NET MVC - validacion de datosASP.NET MVC - validacion de datos
ASP.NET MVC - validacion de datos
 
Ruby On Rails Intro
Ruby On Rails IntroRuby On Rails Intro
Ruby On Rails Intro
 
09b jsf (1)
09b jsf (1)09b jsf (1)
09b jsf (1)
 
JSP
JSPJSP
JSP
 

Ähnlich wie Introducción a AngularJS

Ähnlich wie Introducción a AngularJS (20)

Angular js
Angular jsAngular js
Angular js
 
Cursos web
Cursos webCursos web
Cursos web
 
Desarrollo de aplicaciones multiplataforma 2/2
Desarrollo de aplicaciones multiplataforma 2/2Desarrollo de aplicaciones multiplataforma 2/2
Desarrollo de aplicaciones multiplataforma 2/2
 
Angularjs
AngularjsAngularjs
Angularjs
 
J query
J queryJ query
J query
 
Jsf Java Server Faces
Jsf   Java Server FacesJsf   Java Server Faces
Jsf Java Server Faces
 
Descubriendo Ruby on Rails (Desarrollo Agil de Aplicaciones Web)
Descubriendo Ruby on Rails (Desarrollo Agil de Aplicaciones Web)Descubriendo Ruby on Rails (Desarrollo Agil de Aplicaciones Web)
Descubriendo Ruby on Rails (Desarrollo Agil de Aplicaciones Web)
 
Descubriendo Ruby On Rails (Desarrollo Agil De Aplicaciones Web)
Descubriendo Ruby On Rails (Desarrollo Agil De Aplicaciones Web)Descubriendo Ruby On Rails (Desarrollo Agil De Aplicaciones Web)
Descubriendo Ruby On Rails (Desarrollo Agil De Aplicaciones Web)
 
Asp.net mvc
Asp.net mvcAsp.net mvc
Asp.net mvc
 
Integrando AngularJS y drupal
Integrando AngularJS y drupalIntegrando AngularJS y drupal
Integrando AngularJS y drupal
 
Curso AngularJS - 7. temas avanzados
Curso AngularJS - 7. temas avanzadosCurso AngularJS - 7. temas avanzados
Curso AngularJS - 7. temas avanzados
 
ASP.NET MVC Workshop Día 3
ASP.NET MVC Workshop Día 3ASP.NET MVC Workshop Día 3
ASP.NET MVC Workshop Día 3
 
JqueryMobile
JqueryMobile JqueryMobile
JqueryMobile
 
Spring Mvc Final
Spring Mvc FinalSpring Mvc Final
Spring Mvc Final
 
Introducción a JQuery
Introducción a JQueryIntroducción a JQuery
Introducción a JQuery
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
 
Despegar Tech Talk - AngularJS
Despegar Tech Talk - AngularJSDespegar Tech Talk - AngularJS
Despegar Tech Talk - AngularJS
 
Diseño en la web
Diseño en la webDiseño en la web
Diseño en la web
 
Jc Web20 Open Source Why Floss2007
Jc Web20 Open Source Why Floss2007Jc Web20 Open Source Why Floss2007
Jc Web20 Open Source Why Floss2007
 
Framework
FrameworkFramework
Framework
 

Mehr von Leopoldo Rojas Moguel

Uso Estratégico de la Tecnología de la Información
Uso Estratégico de la Tecnología de la InformaciónUso Estratégico de la Tecnología de la Información
Uso Estratégico de la Tecnología de la InformaciónLeopoldo Rojas Moguel
 
Nube. Móviles. Redes Sociales. Big Data.
Nube. Móviles. Redes Sociales. Big Data.Nube. Móviles. Redes Sociales. Big Data.
Nube. Móviles. Redes Sociales. Big Data.Leopoldo Rojas Moguel
 
Las Redes Sociales como promotoras de Inclusión Social
Las Redes Sociales como promotoras de Inclusión SocialLas Redes Sociales como promotoras de Inclusión Social
Las Redes Sociales como promotoras de Inclusión SocialLeopoldo Rojas Moguel
 

Mehr von Leopoldo Rojas Moguel (6)

Ruby on Rails y AngularJS
Ruby on Rails y AngularJSRuby on Rails y AngularJS
Ruby on Rails y AngularJS
 
Uso Estratégico de la Tecnología de la Información
Uso Estratégico de la Tecnología de la InformaciónUso Estratégico de la Tecnología de la Información
Uso Estratégico de la Tecnología de la Información
 
Herramientas de software en La Nube
Herramientas de software en La NubeHerramientas de software en La Nube
Herramientas de software en La Nube
 
Nube. Móviles. Redes Sociales. Big Data.
Nube. Móviles. Redes Sociales. Big Data.Nube. Móviles. Redes Sociales. Big Data.
Nube. Móviles. Redes Sociales. Big Data.
 
Las Redes Sociales como promotoras de Inclusión Social
Las Redes Sociales como promotoras de Inclusión SocialLas Redes Sociales como promotoras de Inclusión Social
Las Redes Sociales como promotoras de Inclusión Social
 
Tecnologias Emergentes Digitales
Tecnologias Emergentes DigitalesTecnologias Emergentes Digitales
Tecnologias Emergentes Digitales
 

Introducción a AngularJS

  • 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
  • 3. Agenda: Día 2 Creando una aplicación AngularJS
  • 4. Agenda: Día 3 1. Integrando AngularJS con servicios de servidor Web 2. Tópicos relacionados con el desarrollo en SPA 3. Wrap-up
  • 5. Trend Topic - 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
  • 8.
  • 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)
  • 12. Framework AngularJS Templates Directives Modelo Scope Data Binding Deep Linking Routing Views Filters Controller Dependency Injection Módulos Servicios …
  • 13.
  • 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>
  • 18. Controladores y directivas function TeamsCtrl($scope) { $scope.teams = [ {name:'Costa Rica', eliminated:false}, {name:'Brazil', eliminated:true}]; $scope.addTeam = function() { $scope.teams.push({name:$scope.teamName, eliminated:false}); $scope.teamName = ''; }; …
  • 19. Controladores y directivas … $scope.remaining = function() { var count = 0; angular.forEach($scope.teams, function(team) { count += team.eliminated ? 0 : 1; }); return count; }; $scope.restart = function() { var oldTeams = $scope.teams; $scope.teams = []; angular.forEach(oldTeams, function(team) { if (!team.eliminated) $scope.teams.push(team); }); }; }
  • 20. Rutas y servicios .config(function($routeProvider) { $routeProvider .when('/', { controller:'TeamsCtrl', templateUrl:'3teams.html' }) .when('/new', { controller:'CreateCtrl', templateUrl:'3team.html' }) .otherwise({ redirectTo:'/' }); })
  • 21. Rutas y servicios .controller('TeamsCtrl', function($scope, Teams) { $scope.teams = Teams.getTeams(); }) .controller('CreateCtrl', function($scope, $location, Teams) { $scope.save = function() { $scope.teams = Teams.includeTeam($scope.team); $scope.team = {}; $location.path('/'); }; });
  • 22. Rutas y servicios .factory('Teams', function($http) { teams = [ {"name":"Costa Rica", "starPlayer": "Joel Campbell", "site": "http://www.fifa.com/worldcup/teams/team=43901/index.html"}, {"name":"Brasil", "starPlayer": "Neymar", "site": "http://www.fifa.com/worldcup/teams/team=43924/index.html"} ]; return { getTeams: function() { return teams; }, includeTeam: function(team) { return teams.push(team); } } })
  • 23.
  • 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)
  • 25. Por cierto, ¿qué es MEAN stack?
  • 26.
  • 29. Arquitectura general de AngularJS Fuente: Dan Wahlin Blog - http://weblogs.asp.net/dwahlin/
  • 30. Arquitectura general de AngularJS Fuente: Dan Wahlin Blog - http://weblogs.asp.net/dwahlin/
  • 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 …
  • 52. Gran cantidad de Directivas ngBind, ngBindHtml, ngBindTemplate, ngBlur, ngChange, ngChecked, ngClass, ngClassEven, ngClassOdd, ngClick, ngCloak, ngController, ngCopy, ngCsp, ngCut, ngDblclick, ngDisabled, ngFocus, ngForm, ngHide, ngHref, ngIf, ngInclude, ngInit, ngKeydown, ngKeypress, ngKeyup, ngList, ngModel, ngMousedown, ngMouseenter, ngMouseleave, ngMousemove, ngMouseover, ngMouseup, ngNonBindable, ngOpen, ngPaste, ngPluralize, ngReadonly, ngRepeat, ngSelected, ngShow, ngSrc, ngSrcset, ngStyle, ngSubmit, ngSwitch, ngTransclude, ngValue
  • 53.
  • 54.
  • 55.
  • 56. SPA vs Aplicación Web tradicional
  • 57.
  • 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
  • 59. $http y $resource en AngularJS $http.get('teams/teams.json').success(function(data) { teams = data; $scope.team = teams.filter(function(team){ return team.id == $routeParams.teamId; })[0]; }); worldCupServices.factory('Team', ['$resource', function($resource){ return $resource('teams/:teamId.json', {}, { query: {method:'GET', params:{teamId:'teams'}, isArray:true} }); }]);
  • 60.
  • 61. 3-way Data Binding Fuente: Sitio Web de AngularJS
  • 62.
  • 64. AngularJS y Cordova (aka PhoneGap)
  • 67.
  • 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