1 of 18

Construcción de Interfaces de Usuario

Introducción a la Programación Web

2 of 18

Arquitectura Web

Cliente "Liviano"

Aplicación Distribuida

Múltiples clientes distintos

El cliente tiene la iniciativa

¿Stateless o stateful?

Comunicación asincrónica

3 of 18

¡Muchas tecnologias!

Lo básico:

  • HTTP
  • HTML
  • CSS
  • JavaScript
  • algunos frameworks:
  • Bootstrap
  • Angular
  • JQuery
  • ¡el servidor!
  • … cientos de posibilidades

y todavía hay mucho más

  • npm
  • bower
  • ...

4 of 18

Estructura básica de una URL

Protocolo

Servidor

Puerto

Recurso

  • Página
  • Servicio
  • ...

Parámetros

Y lo que no se ve:

  • Método (GET, POST, …)
  • Código de respuesta
    • 200 = Ok
    • 403 = Forbidden
    • 404 = Not found
    • 500 = Internal server error
    • ...

5 of 18

Estructura Básica de una página HTML

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Page Title</title>

</head>

<body>

<h1>My First Heading</h1>

<p>My first paragraph.</p>

</body>

</html>

6 of 18

CSS Básico

<!DOCTYPE html>

<html>

<head>

<style>

body {background-color:lightgray}

h1 {color:blue}

p {color:green}

</style>

</head>

<body>

<h1>This is a heading</h1>

<p>This is a paragraph.</p>

</body>

</html>

7 of 18

Bootstrap

Bootstrap

8 of 18

Arquitecturas Web

9 of 18

AngularJS

  • Data binding
  • Estructuras comunes para controlar el DOM
    1. Repetición
    2. Mostrar u ocultar fragmentos
  • Soporte para formularios y validaciones
  • Asociar comportamiento a elementos del DOM�Por ejemplo: manejo de eventos
  • Herramientas para construir componentes reutilizables

10 of 18

Data Binding en AngularJS

11 of 18

HTML: Controles y Formularios

Los controles son las herramientas que tiene el usuario para ingresar datos:

  • input,
  • select,
  • textarea

Un formulario es una colección de controles que trabajan en conjunto.

12 of 18

AngularJS: Conceptos Básicos

  • es un template, no es html puro
  • el compilador de Angular lo traduce a una vista, interpretando las directivas

Millas: <input type="number" ng-model="kilometros">

<button ng-click="convertir()">Convertir</button>

Kilometros: <span>{{kilometros}}</span>

Muchas tecnologías para construir interfaces web utilzan templates.

13 of 18

AngularJS Controllers

var app = angular.module('conversorApp', [])��app.controller('ConversorController', function ($scope) {

$scope.millas = 0;� $scope.kilometros = ' <ingrese millas> '

� $scope.convertir = function() {� $scope.kilometros = $scope.millas * 1.60934}});

El scope también puede contener comportamiento

Crear una aplicación

Cada formulario tiene un controller

El estado del scope se bindea con controles de un formulario

14 of 18

Web Services

15 of 18

RESTful Services

app.service('Libros', function($http) {

this.query = function(callback, errorHandler) {

$http.get('/libros').success(callback).error(errorHandler);

}

this.save = function(libro, callback, errorHandler) {

$http.post('/libros', libro).success(callback).error(errorHandler);

}

this.update = function(libro, callback, errorHandler) {

$http.put('/libros/' + libro.id, libro).success(callback).error(errorHandler);

}

this.remove = function(libro, callback, errorHandler) {

$http.delete('/libros/' + libro.id).success(callback).error(errorHandler);

}

});

16 of 18

RESTful Services con $resource

app.factory('Libros', function($resource) {

return $resource('/libros/:id', {'id': '@id'}, {

'update': { method:'PUT' }

});

});

Opcional

{ 'get': {method:'GET'},� 'save': {method:'POST'},� 'query': {method:'GET', isArray:true},� 'remove': {method:'DELETE'},� 'delete': {method:'DELETE'}};

Creación

Estructura de un $resource

17 of 18

¿Cómo se usan?

$scope.actualizarLista = function() {

Libros.query(function(data) { $scope.libros = data; }, errorHandler);

}

$scope.agregarLibro = function() {

Libros.save($scope.nuevoLibro, function(data) {

$scope.notificarMensaje('Libro agregado con id:' + data.id);

$scope.actualizarLista();

$scope.nuevoLibro = null;

}, errorHandler);

};

Callback para recibir el resultado asincrónicamente

El objeto libro se convierte a JSon automáticamente

18 of 18

var errorHandler = function(data, status) {

if (data.error)

$scope.notificarError("Error: " + data.error);

else

$scope.notificarError(status + ": " + data);

};

$scope.errors = [];

$scope.notificarError = function(mensaje) {

$scope.errors.push(mensaje);

$timeout(function(){

while($scope.errors.length > 0) $scope.errors.pop();

}, 3000);

}