Documentos de Académico
Documentos de Profesional
Documentos de Cultura
SESION 13 - Angular Diapositivas
SESION 13 - Angular Diapositivas
SESION 14
Angular
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Introducción
Angular 2
● Angular es un framework para desarrollo SPA
● Permite extender el HTML con etiquetas propias
● Con aspecto personalizado (HTML,CSS)
● Con comportamiento personalizado (JavaScript)
● Interfaz basado en componentes (no en páginas)
● Se recomienda usar con TypeScript (aunque se
puede con ES5 y ES6)
● Inyección de dependencias
https://angular.io/ 12
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Introducción
Angular 2 vs Angular 1
● Acaba de publicarse la versión final (Sept 2016)
● Está implementado desde cero, no como una
evolución de Angular 1
● Angular 2 no es compatible con Angular 1
● Cuidado, la documentación de Angular 1 no sirve
paraAngular 2
$scope
3
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Introducción
ES5 ES6
4
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Introducción
ES5 ES6
5
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Introducción
Funcionalidades de Angular 2
● Inyección de dependencias
● Servicios
● Cliente http (APIs REST)
● Navegación por la app (Router)
● Animaciones
● Internacionalización
● Soporte para tests unitarios y e2e
● Librerías de componentes: Material Design
● Renderizado en el servidor
● ...
6
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Angular 2
● Introducción a Angular 2
● TypeScript
● Herramientas de desarrollo
● Componentes
● Templates
● Composición de componentes
● Cliente REST e inyección de dependencias
● Servicios
● Aplicaciones multipágina: Router
● Librerías de componentes
● Conclusiones
7
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
TypeScript
Características
● Añade tipos estáticos a JavaScript ES6
● Inferencia de tipos (no hay que declararlos en muchos sitios)
●
Tipos opcionales (si no quieres, no los usas)
● El compilador genera código JavaScript ES5
(compatible con los navegadores web actuales)
● Orientado a Objetos con clases (no como ES5)
● Anotaciones
http://www.typescriptlang.org/
https://www.gitbook.com/book/basarat/typescript/details
18
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
TypeScript
10
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
TypeScript
export class Empleado { TypeScript
private nombre:string;
private salario:number;
constructor(nombre:string,salario:number){
this.nombre = nombre;
this.salario = salario;
}
getNombre(){
return this.nombre;
}
toString(){
return "Nombre:"+this.nombre+
", Salario:"+this.salario;
}
}
11
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
TypeScript
private nombre:string;
private salario:number;
empleados.forEach(emp => {
console.log(emp);
});
19
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
TypeScript
20
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
TypeScript
EnTS las variables se declaran con let y tienen ámbito de bloque y no se pueden declarar dos
veces. Se podría usar var (como JS), pero el ámbito sería la función y se podrían redeclarar
32
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
TypeScript
EnTS las variables se pueden declarar con tipo (después de :), pero es opcional porque el tipo
se infiere de la inicialización. En Java no lo veremos hasta Java 9 o Java 10
33
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
TypeScript
System.out.println(num); console.log(num);
ERROR
29
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
TypeScript
Uso de this con la arrow function
JavaScript TypeScript
Empleado.prototype.alerta(button){ alerta(button:HTMLButtonElement){
var that = this; button.onclick = e => {
button.onclick = function(e){ alert(this.nombre);
alert(that.nombre); }
} }
} }
EnTS una arrow function permite usar this y siempre apunta al objeto
(como Java). En JS, dentro del una función this puede cambiar de valor
(y es necesario usar that para referirse al objeto)
30
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
TypeScript
Anotaciones
31
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
TypeScript
private name:string;
constructor(name: string) {
this.name = name;
}
}
32
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
TypeScript
class Animal {
constructor(private name: string) {
}
}
En TS se puede declarar un atributo e inicializar su valor desde el constructordeclarando
ese atributo como parámetro del constructor y usando el modificar de visibilidad 43
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
TypeScript
get bar() {
return ...; let foo = new Foo();
}
if(foo.bar){
set bar(bar: boolean) { foo.bar = false;
... }
}
}
34
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
TypeScript
get bar() {
return ...; let foo = new Foo();
}
if(foo.bar){
set bar(bar: boolean) { foo.bar = false;
... }
}
}
35
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
TypeScript
Type guards Instanceof / typeof
class Animal { eat() { } }
Animal class Dog extends Animal { woof() { } }
class Cat extends Animal { meow() { } }
eat()
let pet: Animal = ...;
if (pet instanceof Dog) {
ADniomgal AnCiamtal pet.woof();
weoaot(f)() meeaotw()() } else if (pet instanceof Cat) {
pet.meow();
} else {
pet.eat();
} Disponible también en
46
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
TypeScript
interface SquareConfig {
color: string;
width?: number;
}
37
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
TypeScript
interface SquareConfig {
color: string;
width?: number;
}
38
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
TypeScript
Programación asíncrona
Simulación de sincronía con async / await
function loadData() { async function loadData() {
return getJSON('data.json') try {
.then(data=>{
let data =
addHtmlToPage(data); await getJSON('data.json');
Tipos unión
let id: string | number;
41
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
TypeScript
class Profile {
constructor(public name:string){}
}
let u: User;
u = { name: "Pepe" };
u = new Profile("Pepe");
42
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
TypeScript
class Profile {
constructor(public name:string){}
}
Editores / IDEs
Hay plugins para la mayoría de los editores / IDEs
SublimeText VisualStudio
WebStorm
Code
55
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
WebStorm 11
WebStorm 11
WebStorm 11
Atom / atom-typescript
https://atom.io/packages/atom-typescript
TypeScript
Popularidad deTypeScript
TypeScript
coffeescript
ES6
50
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Angular 2
● Introducción a Angular 2
● TypeScript
● Herramientas de desarrollo
● Componentes
● Templates
● Composición de componentes
● Cliente REST e inyección de dependencias
● Servicios
● Aplicaciones multipágina: Router
● Librerías de componentes
● Conclusiones
51
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Herramientas de desarrollo
Plataforma para
ejecutar aplicaciones JS
fuera del navegador
Gestor de herramientas
de desarrollo y librerías
JavaScript (integrado
con node.js)
53
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Herramientas de desarrollo
55
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Herramientas de desarrollo
http://gulpjs.com/ http://broccolijs.com/
http://gruntjs.com/ https://webpack.github.io/
56
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Herramientas de desarrollo
58
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Herramientas de desarrollo
ng new ejem1
cd ejem1
62
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Herramientas de desarrollo
https://karma-runner.github.io
http://jasmine.github.io/
https://webpack.github.io/
Construcción http://www.protractortest.org/
del proyecto
Herramientas de testing 73
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Herramientas de desarrollo
65
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Herramientas de desarrollo
● Ficheros/Carpetas
generadas
● E2e: Testing end to end
● dist: Recursos que hay que
publicar en el servidor web
● node_modules: Librerías y
herramientas descargadas
● src: Fuentes de la aplicación
● package.json:
Configuración de librerías y
herramientas
66
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Herramientas de desarrollo
● Ficheros/Carpetas generadas
● src/app:
● Carpeta que contiene los ficheros fuente
principales de la aplicación.
● Borraremos su contenido y le sustituiremos por
los ejemplos
● main.ts: Fichero principal de la aplicación. No
es necesario modificarle
● favicon.ico: Icono de la aplicación
● index.html: Página principal. Se editará para
incluir CSS globales en la web (bootstrap)
● tsconfig.json: Configuración del compiladorTS
67
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Herramientas de desarrollo
Al guardar un fichero el
<h1> navegador se recarga de
{ { t i t l e}} forma automática y
</ h1> vemos los cambios
app.component.html
<h1>
{ { t i t l e} }
</ h1>
Hola caracola!
68
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Herramientas de desarrollo
● Introducción a Angular 2
● TypeScript
● Herramientas de desarrollo
● Componentes
● Templates
● Composición de componentes
● Cliente REST e inyección de dependencias
● Servicios
● Aplicaciones multipágina: Router
● Librerías de componentes
● Conclusiones
72
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Componentes
Componentes en Angular 2
● Un componente es una nueva etiqueta HTML
con una vista y una lógica definidas por el
desarrollador
● La vista es una plantilla (template) en HTML
con elementos especiales
● La lógica es una claseTypeScript vinculada a
la vista
73
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Componentes
Componentes en Angular 2
● Copiamos el contenido de la carpeta src/app
del ejem1
74
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Componentes
ejem1
Componentes en Angular 2
app.component.ts
app.component.html
@Component({
selector: 'app-root', <h1>My First Angular 2 App</h1>
templateUrl: './app.component.html'
})
export class AppComponent {
}
Lógica Vista
75
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Componentes
ejem1
Componentes en Angular 2
app.component.ts
app.component.html
@Component({
selector: 'app-root', <h1>My First Angular 2 App</h1>
templateUrl: './app.component.html'
})
export class AppComponent {
}
Lógica Vista
76
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Componentes
ejem1
Componentes en Angular 2
app.component.ts
@Component({ app.component.html
selector: 'app-root',
templateUrl: './app.component.html' <h1>My First Angular 2 App</h1>
})
export class AppComponent {
}
Este componente no
tiene ninguna lógica
Lógica Vista
77
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Componentes
app.component.ts ejem1
import { Component } from '@angular/core';
@Component({ app.component.html
selector: 'app-root',
templateUrl: './app.component.html' <h1>My First Angular 2 App</h1>
})
export class AppComponent {
}
Para usar el componente se
incluye en el index.html un
elemento HTML con el
src/index.html nombre indicado en el selector
<html> (en este caso app-root)
<head>...</head>
<body>
<app-root>Loading...</app-root>
</body>
</html>
78
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Componentes
ejem1
Componentes en Angular 2
Toda app tiene un módulo que define los
componentes de la app, el componente principal y
qué otros módulos necesita
app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { NgModule } from '@angular/core';
81
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Componentes
ejem1
Componentes en Angular 2
app.component.ts
@Component({
selector: 'app-root',
templateUrl: ` Se puede incluir la vista (HTML
<h1> del template) directamente en
My First Angular 2 App la clase. Si se usa la tildes
</h1> invertidas ( `) (grave accent),se
` puede escribir HTML multilínea
})
export class AppComponent {
}
82
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Componentes
ejem2
Visualización de una variable
La vista del componente (HTML) se genera en función
de su estado (atributos de la clase)
app.component.ts app.component.html
@Component({
selector: 'app-root',
templateUrl: './app.component.html'
})
export class AppComponent {
name = 'Anybody';
imgUrl = "assets/img.png";
}
83
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Componentes
ejem2
Visualización de una variable
La vista del componente (HTML) se genera en función
de su estado (atributos de la clase)
app.component.ts app.component.html
@Component({
selector: 'app-root',
templateUrl: './app.component.html'
})
export class AppComponent {
name = 'Anybody';
imgUrl = "assets/img.png";
}
84
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Componentes
ejem2
Recursos de la app
Los recursos (imágenes, fonts..) deben colocarse en
una carpeta src/assets para que se copien en el build
85
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Componentes
ejem3
Ejecución de lógica
Se puede ejecutar un método ante un evento
producido en la vista del componente
app.component.ts
import {Component} from '@angular/core';
@Component({
selector: 'app',
templateUrl: './app.component.html'
})
export class AppComponent { app.component.html
@Component({
selector: 'app',
templateUrl: './app.component.html'
})
export class AppComponent { app.component.html
<button (click)="setName('John')">
setName(name:string){
this.name = name; Hello John
} </button>
} 98
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Componentes
ejem3
Ejecución de lógica
Se puede ejecutar un método ante un evento
producido en la vista del componente
99
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Componentes
ejem4
Datos enlazados (data binding)
Un campo de texto se puede “enlazar” a un atributo
Atributo y componente están sincronizados
app.component.ts
import {Component} from '@angular/core';
@Component({
selector: 'app', app.component.html
templateUrl: './app.component.html '
}) <input type="text" [(ngModel)]="name">
export class AppComponent {
<h1>Hello {{name}}!</h1>
name = 'Anybody';
<button (click)="setName('John')">
setName(name:string){ Hello John
this.name = name; </button>
}
} 100
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Componentes
ejem4
Datos enlazados (data binding)
Un campo de texto se puede “enlazar” a un atributo
Atributo y componente están sincronizados
app.component.ts
import {Component} from '@angular/core';
@Component({
selector: 'app', app.component.html
templateUrl: './app.component.html '
}) <input type="text" [(ngModel)]="name">
export class AppComponent {
<h1>Hello {{name}}!</h1>
name = 'Anybody';
<button (click)="setName('John')">
setName(name:string){ Hello John
this.name = name; </button>
}
} 101
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Componentes
ejem4
Datos enlazados (data binding)
Un campo de texto se puede “enlazar” a un atributo
Atributo y componente están sincronizados
92
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Angular 2
● Introducción a Angular 2
● TypeScript
● Herramientas de desarrollo
● Componentes
● Templates
● Composición de componentes
● Cliente REST e inyección de dependencias
● Servicios
● Aplicaciones multipágina: Router
● Librerías de componentes
● Conclusiones
93
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Templates
https://angular.io/docs/ts/latest/guide/template-syntax.html
94
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Templates
ejem5
● Visualización condicional
● Se puede controlar si un elemento aparece o no en
la página dependiendo del valor de un atributo de
la clase usando la directiva ngIf
● Por ejemplo dependiendo del valor del atributo
booleano visible
<p *ngIf="visible">Text</p>
items = [
{ desc: 'Elem1', check: true }, <div>Elem1</div>
{ desc: 'Elem2', check: true }, <div>Elem2</div>
{ desc: 'Elem3', check: false } <div>Elem3</div>
]
96
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Templates
ejem5
● Directivas
● Las directivas modifican a los elementos en los que
se incluyen
● Existen muchas directivas predefinidas y podemos
programar nuestras propias directivas
● Las directivas estructurales empiezan por * y
modifican el DOM del documento (*ngIf, *ngFor,
*ngSwitch)
● El * es azúcar sintáctico para la definición del
template
97
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Templates
ejem5
● Directivas
● No se pueden incluir dos directivas estructurales (de tipo *) en
el mismo elemento
<li *ngFor="let elem of elems" *ngIf="elem.check">
{{elem.desc}}
</li>
https://github.com/angular/angular/issues/4792 108
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Templates
ejem5
● Estilos
● Existen varias formas de definir un CSS en
Angular 2
● Globalmente asociado al index.html
● Local al componente:
● En la propiedad styles o styleUrls de
@Component
● En el template
99
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Templates
ejem5
● Estilos
● Globalmente asociado al index.html
● Podemos modificar manualmente el fichero
index.html y asociar un CSS (como haríamos con
cualquier HTML)
● Con angular-cli, si creamos un fichero
src/styles.css se incluirá de forma automática en
el index.html
https://github.com/angular/angular-cli#global-styles
100
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Templates
ejem5
● Estilos
● En la propiedad styles o styleUrls de @Component
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styles: [`
.red { color: red; }
.blue { color: blue; } Se suelen usar los strings
`] multilínea con tildes
invertidas
})
export class AppComponent {
...
}
http://blog.thoughtram.io/angular/2015/06/25/styling-angular-2-components.htm1l11
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Templates
ejem5
● Estilos
● En la propiedad styles o styleUrls de @Component
@Component({
selector: 'app',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
...
}
<button (click)="setClass('blue')">Blue</button>
...
http://blog.thoughtram.io/angular/2015/06/25/styling-angular-2-components.htm1l13
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Templates
ejem5
● Estilos
● Hay muchas formas de controlar los estilos de los
elementos
● Asociar la clase de un elemento a un atributo de tipo
string
● Activar una clase concreta con un atributo boolean
● Asociar la clase de un elemento a un atributo de tipo
mapa de string a boolean
● Asociar un estilo concreto de un elemento a un atributo
104
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Estilos
ejem5
● Asociar la clase de un elemento a un
atributo string
● Cambiando el valor del atributo se cambia la clase
del elemento
● Por ejemplo, la clase del elemento h1 se cambia
modificando el atributo className
<h1 [class]="className">Title!</h1>
105
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Estilos
ejem5
● Activar una clase concreta con un atributo
boolean
● Activa o desactiva una clase red con el valor de
redActive
<h1 [class.red]="redActive">Title!</h1>
pClasses = {
"red": false, changeParagraph(){
this.pClasses.bold = true;
"bold": true
}
}
107
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Estilos
ejem5
● Asociar un estilo concreto a un atributo
● En algunos casos es mejor cambiar el estilo
directamente en el elemento
<p [style.backgroundColor]="pColor">Text</p>
● Con unidades
<p [style.fontSize.em]="pSizeEm">Text</p>
<p [style.fontSize.%]="pSizePerc">Text</p>
108
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Estilos
ejem5
● Asociar un estilo concreto a un atributo
● Usando mapas de propiedad a valor
<p [ngStyle]="getStyles()">Text</p>
getStyles(){
return {
'font-style':this.canSave? 'italic':'normal',
'font-weight':!this.isUnchanged? 'bold':'normal',
'font-size':this.isSpecial? '24px':'8px',
}
}
109
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Formularios
https://angular.io/docs/ts/latest/guide/forms.html
110
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Formularios
ejem6
● Campo de texto
● Se vincula el control a un atributo del componente
con [(ngModel)]
● Cualquier cambio en el control se refleja en el valor
del atributo (y viceversa)
name:string
111
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Formularios
ejem6
● Checkbox basado en booleanos
● Cada control se asocia con [(ngModel)] a un
atributo booleano y su valor depende de si está
“checked”
<input type="checkbox" [(ngModel)]="angular"/>
Angular
<input type="checkbox" [(ngModel)]="javascript"/>
JavaScript
angular:boolean
javascript:boolean
112
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Formularios
ejem6
● Checkbox basado en array de objetos
● Cada control se asocia con [(ngModel)] a un
atributo booleano de un objeto de un array
<span *ngFor="let item of items">
<input type="checkbox"
[(ngModel)]="item.selected"/> {{item.value}}
</span>
items = [
{value:'Item1', selected:false},
{value:'Item2',selected:false}
]
113
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Formularios
ejem6
● Botones de radio
● Todos los botones del mismo grupo se asocian al
mismo atributo con [(ngModel)]
● El valor del atributo es el “value” del control
<input type="radio" name="gender"
[(ngModel)]="gender" value="Male"> Male
gender:string
114
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Formularios
ejem6
● Acceso a los controles desde el código
● Un elemento del template puede asociarse a una variable
● Podemos usar esa variable en el código del template para
manejar ese elemento
Este control input puede
referenciarse con la
variable cityInput
<input #cityInput type="text">
116
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Ejercicio 1
117
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Angular 2
● Introducción a Angular 2
● TypeScript
● Herramientas de desarrollo
● Componentes
● Templates
● Composición de componentes
● Cliente REST e inyección de dependencias
● Servicios
● Aplicaciones multipágina: Router
● Librerías de componentes
● Conclusiones
118
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Composición de componentes
Árboles de componentes
En Angular 2 un componente puede estar formado
por más componentes formando un árbol
App
Comp1 Comp2
119
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Composición de componentes
Árboles de componentes
En Angular 2 un componente puede estar formado
por más componentes formando un árbol
App
Comp1 Comp2
120
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Composición de componentes
App
Árboles de componentes
Header
<header></header>
<p>Main content</p>
<h1>Title</h1>
<p>Main content</p> <header>
<h1>Title</h1>
121
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Composición de componentes
App ejem7
Árboles de componentes
Header
app.component.ts header.component.ts
import {Component} from import {Component} from
'@angular/core'; '@angular/core';
@Component({ @Component({
selector: 'app-root', selector: 'header',
templateUrl: templateUrl:
'./app.component.html' './header.component.html'
}) })
export class AppComponent {}
export class HeaderComponent {}
app.component.html header.component.html
<header></header> <h1>Title</h1>
<p>Main content</p>
122
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Composición de componentes
App ejem7
Árboles de componentes
Header
app.component.ts header.component.ts
import {Component} from import {Component} from
'@angular/core'; '@angular/core';
@Component({ @Component({
selector: 'app-root', selector: 'header',
templateUrl: templateUrl:
'./app.component.html' './header.component.html'
}) })
export class AppComponent {}
export class HeaderComponent {}
app.component.html header.component.html
Para incluir un
<header></header> componente se usa<h1>Title</h1>
<p>Main content</p> su selector
133
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Composición de componentes
App ejem7
Árboles de componentes
Header
app.module.ts
@NgModule({
declarations: [AppComponent, HeaderComponent],
imports: [BrowserModule, FormsModule],
bootstrap: [AppComponent] Todos los
})
export class AppModule { }
componentes de
la app deben
declararse en el
@NgModule
124
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Composición de componentes
ejem7
Árboles de componentes
● Al cargar la app en
el navegador, en el
árbol DOM cada
componente
incluye en su
elemento el
contenido de la
vista (HTML)
125
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Composición de componentes
https://angular.io/docs/ts/latest/cookbook/component-communication.html 126
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Composición de componentes
ejem8
Configuración de propiedades
(Padre →Hijo)
https://angular.io/docs/ts/latest/cookbook/component-communication.html 127
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Composición de componentes
ejem8
Configuración de propiedades
(Padre →Hijo)
app.component.ts header.component.ts
import {Component, Input} from
... '@angular/core';
...
export class AppComponent { export class HeaderComponent {
appTitle = 'Main Title';
} @Input()
private title: string;
}
app.component.html header.component.html
<header [title]='appTitle'></header> <h1>{{title}}</h1>
<p>Main content</p>
https://angular.io/docs/ts/latest/cookbook/component-communication.html 128
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Composición de componentes
ejem8
Configuración de propiedades
(Padre →Hijo)
app.component.ts header.component.ts
import {Component, Input} from
... '@angular/core';
...
export class AppComponent { export class HeaderComponent {
appTitle = 'Main Title';
} @Input()
private title: string;
}
https://angular.io/docs/ts/latest/cookbook/component-communication.html 129
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Composición de componentes
ejem8
Configuración de propiedades
(Padre →Hijo)
app.component.ts header.component.ts
import {Component, Input} from
... '@angular/core';
...
export class AppComponent { export class HeaderComponent {
appTitle = 'Main Title';
} @Input()
private title: string;
}
app.component.html header.component.html
<header [title]='appTitle'></header> <h1>{{title}}</h1>
<p>Main content</p>
https://angular.io/docs/ts/latest/cookbook/component-communication.html 130
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Composición de componentes
ejem9
Envío de eventos
(Hijo →Padre)
https://angular.io/docs/ts/latest/cookbook/component-communication.html 131
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Composición de componentes
ejem9
Envío de eventos
(Hijo →Padre)
app.component.ts
...
export class AppComponent {
hiddenTitle(hidden: boolean){
console.log("Hidden:"+hidden)
}
}
app.component.html
<header (hidden)='hiddenTitle($event)'></header>
<p>Main content</p>
https://angular.io/docs/ts/latest/cookbook/component-communication.html 132
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Composición de componentes
ejem9
Envío de eventos
(Hijo →Padre)
app.component.ts
...
export class AppComponent {
hiddenTitle(hidden: boolean){
console.log("Hidden:"+hidden)
}
}
app.component.html
<header (hidden)='hiddenTitle($event)'></header>
<p>Main content</p>
https://angular.io/docs/ts/latest/cookbook/component-communication.html 133
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Composición de componentes
ejem9
Envío de eventos
(Hijo →Padre)
app.component.ts
...
export class AppComponent {
hiddenTitle(hidden: boolean){
console.log("Hidden:"+hidden) Los eventos pueden
} tener valores que se
} capturan con $event
app.component.html
<header (hidden)='hiddenTitle($event)'></header>
<p>Main content</p>
https://angular.io/docs/ts/latest/cookbook/component-communication.html 134
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Composición de componentes
ejem9
Envío de eventos
(Hijo →Padre)
header.component.ts
import {Component, Output, EventEmitter} from '@angular/core';
...
export class HeaderComponent {
@Output()
hidden = new EventEmitter<boolean>();
visible = true;
click(){
this.visible = !this.visible;
this.hidden.next(this.visible);
}
}
header.component.html
<h1 *ngIf="visible">Title</h1>
<button (click)='click()'>Hide/Show</button>
135
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Composición de componentes
ejem9
Envío de eventos
(Hijo →Padre)
header.component.ts
import {Component, Output, EventEmitter} from '@angular/core';
...
export class HeaderComponent {
137
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Ejercicio 2
138
Av. Arenales 395 Oficina 405 - 4336948 - info@cjavaperu.com CJava, siempre para apoyarte.
Composición de componentes