Angular
Ordenador usuario
Servidor facebook
== DAME EL index.HTML =>
<= Toma el index.html ==
== El usuario navega a categories.html =>
Se refresca la pantalla
NAVEGO a categorias.html
Me autosirvo el template
Me renderizo una cosa nueva
Dame todos los ficheros
Toma los scripts y los css
ng new project
Esto es lo importante
Nos encontraremos que cada página o componente se compone de :
un fichero .html
un fichero .css
un fichero .ts
LA VISTA
EL MAQUILLAJE
LA LOGICA
¿Cómo arrancamos nuestro proyecto?
ng serve
<p> El numero PI = {{ getPi() }}</p>
<p>Radio de un círculo : 3cm </p>
<p>Área del círculo {{ (getPi() * radio*radio) }}</p>
export class AppComponent {
radio : number = 3;
getPi(): number {
return 3.14159265359;
}
}
<img
[src]="imagen.fuente"
[alt]="imagen.alt"
[title]="imagen.title"
/>
<a [href]="nuevaRuta"> pincha aquí </a>
//ts
imagen = {
fuente : "https://via.placeholder.com/600/771796",
alt : 'imagen',
title : 'cuadrado random'
}
<img
[src]="image.link"
[alt]="image.alt"
[title]="image.title"
/>
<a [href]="nuevaRuta"> pincha aquí </a>
<div [class]="clases" [id]="id"> Divs</div>
//css
.pintame {
color: red;
}
<p>Num : {{num}}</p>
<button (click)="increment(1)">Sumar 1</button>
<button (click)="increment(2)">Sumar 2</button>
(click)="increment(2)"
(click)="increment(2)"
Fichero.html
Fichero.ts
Fichero.html
Fichero.ts
<p> El numero PI = {{ getPi() }}</p>
<input type="number" placeholder="Radio" [(ngModel)]="radio" />
<p>Área del círculo {{ (getPi() * radio*radio) }}</p>
export class AppComponent {
radio : number = 3;
getPi(): number {
return 3.14159265359;
}
}
TypeScript is a typed superset of JavaScript
that compiles to plain JavaScript
A superset
Error
function createUser(email, name, age){ ...}
Javascript
function createUser(email: string, name: string, age: number){ ...
}
Typescript
//Se declara de la siguiente forma.
export class AppComponent {
public name: string = 'Manolín';
constructor () {
//El constructor es el que primero se
//inicializa al iniciar la clase.
alert(`${this.getHello()} ${this.name}`)
}
// Para declarar una función
public getHello() : string {
return 'Hello';
}
}
this this this
this this this
this this this
this this this
this this this
<ul>
<li *ngFor="let word of stack">{{word}}</li>
</ul>
export class AppComponent {
stack = ['Esto', 'es', 'un', 'array'];
addTask (task) {
this.stack.push(task);
}
}
*ngFor="let word of stack"
Primera iteración: word = stack[0]
Segunda iteración: word = stack[1]
Bucles con Angular (*ngFor)
¿y si tenemos un array de objetos?
export class AppComponent {
public people: any[] = [];
public person: any = {
name: '',
age: null,
type: ''
};
constructor() {
this.people = [
{
name: 'Pedro',
age: 15,
type: 'Young'
}, {
name: 'Borja',
age: 27,
type: 'Adult'
}, {
name: 'Yunior',
age: 50,
type: 'Old'
}
]
}
}
<div *ngIf="people.length > 0">
<div *ngFor="let person of people">
<h3>{{person.name}}</h3>
<small>Edad: {{person.age}}</small>
<br>
<small>Clase: {{person.type}}</small>
</div>
</div>
<div *ngIf="people.length == 0">
<h2>No hay ningúna entrada!</h2>
</div>
¿y si tenemos un array de objetos?
export class AppComponent {
public people: any[] = [];
public person: any = {
name: '',
age: null,
type: ''
};
constructor() {
this.people = [
{
name: 'Pedro',
age: 15,
type: 'Young'
}, {
name: 'Borja',
age: 27,
type: 'Adult'
}, {
name: 'Yunior',
age: 50,
type: 'Old'
}
]
}
}
<div *ngFor="let person of people" class="card"
[ngClass]="{'underage': person.age < 18}"
[hidden]="person.age > 49">
</div>
se muestran todos, menos......? (Pregunta)
Condiciones con Angular (*ngIf)
<div *ngIf="stack.length > 0">
<ul>
<li *ngFor="let task of stack">{{task}}</li>
</ul>
</div>
<div *ngIf="stack.length == 0">
<h2>No hay ningúna entrada!</h2>
</div>
export class AppComponent {
newTask = '';
stack = [];
addTask (task) {
this.stack.push(task);
this.newTask = '';
}
}
*ngIf = "condición"
Aunque no tenga los [], el ngIf espera una condición booleana.
Que le diga si se muestra o no se muestra
*ngIf vs [hidden]
*ngIf vs [hidden]
<button
*ngIf="hideCompleted"
(click)="hideCompleted = !hideCompleted"
>Mostrar completados
</button>
<button
*ngIf="!hideCompleted"
(click)="hideCompleted = !hideCompleted"
>Ocultar completados
</button>
<li
[hidden]="hideCompleted && item.completed"
*ngFor="let item of items"
[ngClass]="{'completed' : item.completed}">
<span (click)="completeMe(item.title)">{{item.title}}</span>
<button (click)="deleteMe(item.title)"> Borrar</button>
</li>
desaparecerá
se hace invisible
Hagamos una aplicación de gestión de tareas que cumpla con:
Pero primero un repaso muy rápido de lo anterior.
Un componente de angular es como una pieza de Lego. Creas un cuerpo principal y vas añadiendo piezas para conformar una figura.
Esto hace que el programa sea más escalable y que cada pieza que compone al programa sea más independiente, evitando romper el resto del programa.
Crear un componente de angular
ng generate component nombre_del_componente
ng generate component nombre_del_componente
ng g component components/nombre_del_componente
¿Qué se genera?
Veamos detalladamente el decorador @component.
Ejemplo
appComponent.html
menu.component.html
@Component({
selector: 'app-menu', // ¿Y esto? Magia (Lo explico un poquito más adelante),
templateUrl: './menu.component.html', //EL html asociado este componente.
styleUrls: ['./menu.component.css'] //El estilo asociado a este componente
})
menu.component.ts
¿No te recuerda al appComponent.ts? Tienen la misma estructura 😊
@Component({
selector: 'app-menu', // ¿Y esto? Magia (Lo explico un poquito más adelante),
templateUrl: './menu.component.html', //EL html asociado este componente.
styleUrls: ['./menu.component.css'] //El estilo asociado a este componente
})
menu.component.ts
@Component({
selector: 'app-menu', // ¿Y esto? Magia (Lo explico un poquito más adelante),
templateUrl: './menu.component.html', //EL html asociado este componente.
styleUrls: ['./menu.component.css'] //El estilo asociado a este componente
})
menu.component.ts
¿No se ve verdad?
Más info
@Component({
selector: 'app-menu', // ¿Y esto? Magia (Lo explico un poquito más adelante),
templateUrl: './menu.component.html', //EL html asociado este componente.
styleUrls: ['./menu.component.css'] //El estilo asociado a este componente
})
menu.component.ts
Más info
Para poder usar un componente, debemos nombrar en el HTML con el nombre del selector
@Component({
selector: 'app-menu', // ¿Y esto? Magia,
templateUrl: './menu.component.html', //EL html asociado este componente.
styleUrls: ['./menu.component.css'] //El estilo asociado a este componente
})
//export class MenuComponent...
Para verlo mejor, descarga esta extensión de chrome.
Se podrá usar solo si estas en localhost.
¿Que más generó el ng component?
En el app.modules. Comenta la linea 6 (como está en la imagen de abajo) y borra lo que está en el cuadrado rojo en la misma imagen.
¿Que sucede?
¿Qué pasa si no lo declaro en el app.module?
¿Qué pasa si no lo declaro en el app.module?
El app.component.html no reconoce la tag <app-menu> del selector del componente
¿Qué pasa si no lo declaro en el app.module?
El app.component.html no reconoce la tag <app-menu> del selector del componente
HORA DE TRABAJAR!
<gallery>
<photo></photo>
<photo></photo>
<photo></photo>
</gallery>
app.component.html
HORA DE TRABAJAR!
<header></header>
<aside></aside>
<Gallery></Gallery>
<photo></photo>
<photo></photo>
<photo></photo>
ANGULAR
COMPONENT
INPUTS
OUTPUTS
En algunos casos, un componente puede haber recibido o realizado un evento y quiere comunicar con su padre dicho evento. Para esto se usa los @Output()
Detallemos cada uno de ellos
Un componente puede recibir valores de su padre, para esto se usarán los @Input()
Los componentes para que estos sean más independientes y que cada uno realice su función, se les pueden pasar datos de entrada (@Input()).
Para explicarlo mejor, usando como ejemplo el ejercicio de ayer:
¿Cómo se usa esto en Angular?
Si queremos enviar un input a un componente, debemos asegurarnos primero que se importe Input
Si queremos enviar un texto desde app component al menu.component.
Declaramos una variable title y delante le añadimos @Input() para decirle a angular que title es un parámetro de entrada.
¿Cómo enviamos el valor?
¿Pero también podemos pasar variables? 🤔
Si, también podemos pasar una variable desde el app.component
Si, también podemos pasar una variable desde el app.component
¿Y si queremos pasar más inputs?
El padre
El hijo (componente)
¿Y si queremos pasar más inputs?
resultado
Puedes pasar tantos como quieras o sean necesarios
¿Y si queremos pasar un array?
Intenta hacerlo tú. Usa el team component para conseguir que se muestren todos los elementos del array people
La base para resolver el ejercicio:
Vamos a ir un paso más allá
Creemos el elemento TeamMember que recibirá un solo person para dibujarlo en la pantalla.
Live coding ! ¿Vamos más allá?
Estos componentes pueden realizar acciones o eventos que pueden ser realizados por el padre del mismo. En este caso son considerados datos de salida (@Output())
Si queremos activar un evento del padre, podremos usar el @output conjunto a un emitidor de evento (EventEmiter).
¿Cómo se usa esto en Angular?
Si queremos enviar un output y emitir un evento desde un componente hijo a un componente padre, debemos asegurarnos primero que se importe Output y el EventEmitter
Para avisar de un evento desde menu component a app.component.
¿Como usamos ese emitidor y como le asignamos un evento?
Supongamos que tenemos un boton en el componente menú y que queremos notificar al app component, que se ha pulsado ese botón haciendo que el app component muestre una alert.
En el menu component ts, declaramos el metodo asociado al click.
En el usamos la variable antes declarada y le decimos que queremos emitir ese valor.
¿Cómo lo recibimos en el app component?
El mismo nombre que hemos usado para declarar los outputs lo usaremos en el app component. Debido a que es un evento los pondremos entre parentesis.
<menu (notifyMyFather)="whatMyChildSay($event)"></menu>
menu.component.ts
app.component.html
Resultado
Ejercicio ! Haz algo como lo siguiente
¿ y si juntamos lo que hemos aprendido en la semana?
Ejercicio
app.component
shopping-list.component
item.component
cart.component
Ejercicio