Angular
<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 word of stack">{{word}}</li>
</ul>
</div>
<div *ngIf="stack.length == 0">
<h2>No hay ningúna entrada!</h2>
</div>
export class AppComponent {
public word : string = '';
public stack : string[] = [];
public addTask (task: string) {
this.stack.push(task);
this.word = '';
}
}
*ngIf = "condición"
Aunque no tenga los [], el ngIf espera una condición booleana.
Que le diga si se muestra o no se muestra
Condiciones con Angular (*ngIf)
<div *ngIf="stack.length > 0">
<ul>
<li *ngFor="let word of stack">{{word}}</li>
</ul>
</div>
<div *ngIf="stack.length == 0">
<h2>No hay ningúna entrada!</h2>
</div>
*ngIf = "condición"
Se muestra solo si stack tiene algo.
Sino, sale el div de debajo.
*ngIf vs [hidden]
*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
Crear un componente de angular
ng generate component nombre_del_componente
ng generate component nombre_del_componente
@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
¿Que más generó el ng component?
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()
¿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
Tenemos un array y pasamos cada objeto al hijo
Crea un componente llamado TEAM y haz que invoque a un componente
MEMBER y que dibuje a cada uno
Usa el JSON de usuarios
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
Usa el JSON de usuarios
Añade los botones en cada user de:
- Borrar
- Marcar como favorito
- Indicar prioridad 1 - 2 - 3
Coloca afuera, un botón para, "Solo ver a los de prioridad 1, 2 ó 3" y otro botón para "ver solo favoritos"
¡ Será como una especie de Agenda de contactos !
¿ y si juntamos lo que hemos aprendido en la semana?
Ejercicio
app.component
shopping-list.component
item.component
cart.component
Ejercicio
app.component
shopping-list.component
item.component
cart.component
Podemos crear un servicio a través del comando
Podemos crear un servicio a través del comando
2 ficheros :
users.service.ts
users.service.spec.ts
¿Por qué estamos creando un servicio?
¿Por qué estamos creando un servicio?
¿Por qué estamos creando un servicio?
NO AL SPAGETTI CODE
Como usamos nuestro servicio
¿Cómo usamos nuestro servicio?
¿Cómo usamos nuestro servicio?
En Angular, los constructores se usan para la inyección de dependencias. Así mantienen el código más desacoplado y más independiente.
¿Cómo usamos nuestro servicio?
En cualquier página, en cualquier componente, o en cualquier otro servicio incluso donde necesitemos cargar los usuarios de la api .... SOLO PONEMOS ESTA LÍNEA DE CÓOODIGOOOOO
¿Se dan cuenta de lo útil que es?
this.users = this.usersService.getAllUsers();
Como será nuestro getAllUsers()
export class UsersService {
constructor(){}
public getAllUsers() : User[]{
return [
{
name : "Luis",
email : "luis@gmail.com"
}
]
}
}
https://sweetalert2.github.io/#download
npm install sweetalert2
import { Injectable } from '@angular/core';
import Swal from 'sweetalert2'
@Injectable({
providedIn: 'root'
})
export class AlertService {
constructor() {
}
public success() {
return Swal.fire(
'Good job!',
'You clicked the button!',
'success'
)
}
}
import { Injectable } from '@angular/core';
import Swal from 'sweetalert2'
@Injectable({
providedIn: 'root'
})
export class AlertService {
constructor() {
}
public success() {
return Swal.fire(
'Good job!',
'You clicked the button!',
'success'
)
}
}
export class AppComponent implements OnInit {
constructor(private alertService : AlertService) {
}
onClick() {
this.alertService.success();
}
}
Crea un servicio para gestionar y lanzar mensajes de alerta y de success llamándole a él desde cualquier componente
https://codeseven.github.io/toastr/demo.html
https://material.angular.io/components/snack-bar/overview
https://sweetalert2.github.io/#download
¿Para hacerte un adulto ya?
FULLSTACK
Cuando el usuario interactúa con nuestras webs o aplicaciones debemos guardar sus datos en algún servidor.
Si un usuario declara eventos en su calendario, tenemos dos opciones:
- O guardamos sus datos solo en local, y ese usuario si reinstala la app o si entra desde otro dispositivo no ve datos.
- O guardamos sus datos en una base de datos en "la nube" y podemos sincronizar sus diferentes dispositivos porque sabemos que vuelve a entrar con el mismo usuario
Una base de datos es básicamente dónde se almacenan los datos de la aplicación.
Estos datos no son solo los que el usuario crea, edita, borra o ve, si no también los propios usuarios, otros datos de configuración de la web, otros datos de tablas que se relacionan con las que el usuario ve, etc etc
A grandes rasgos, porque no es parte del alcance de este curso, existen dos tipos de bases de datos
Relacionales y No Relacionales
La gran mayoría de bases de datos no relacionales están basadas en una estructura JSON
LOS CHICOS DE BACKEND NOS VAN A GUARDAR DATOS EN LA NUBE, NOSOTROS VAMOS A APRENDER A MANDARLE LOS DATOS DESDE EL FRONT Y A PEDIRLES DATOS DESDE EL FRONT
Ordenador usuario
Servidor facebook
== DAME EL HTML =>
<= TOMA EL HTML ==
== DAME LOS POSTS =>
<= TOMA LOS POSTS ==
Le he dado like a este post =>
<= ok, lo tengo en cuenta ==
== He subido un nuevo post =>
<= ok, lo tengo en cuenta ==
Ordenador usuario
Servidor facebook
== DAME EL HTML =>
<= TOMA EL HTML ==
== GET /POSTS =>
<= TOMA LOS POSTS ==
POST /POST/ID/LIKES/ =>
<= ok, lo tengo en cuenta ==
== POST: /ME/POSTS =>
<= ok, lo tengo en cuenta ==
users
posts
pages
messages
GET ( URL )
var URL = 'https://jsonplaceholder.typicode.com/users'
GET ( URL + '/25' )
POST ( URL, DATA )
PUT ( URL + '/25', DATA )
DELETE ( URL + '/25' )
Para pedir datos
Para mandar datos
Digamos, que es la forma de apuntar a un recurso en particular
Tiene dos partes claras, el host y el recurso
Indica la acción que queremos hacer desde el front con nuestra solicitud. Son varios:
GET POST PUT DELETE
var URL = 'https://jsonplaceholder.typicode.com/users'
Digamos, que es la forma de apuntar a un recurso en particular
Tiene dos partes claras, el host y el recurso
Indica la acción que queremos hacer desde el front con nuestra solicitud. Son varios:
GET POST PUT DELETE
var URL = 'https://jsonplaceholder.typicode.com/users'
== DAME LOS POSTS =>
<= TOMA LOS POSTS ==
GET
var URL = 'https://jsonplaceholder.typicode.com/users'
Para pedir
POST
PUT
DELETE
Para añadir
Para actualizar
Para borrar
GET
var URL = 'https://jsonplaceholder.typicode.com/users'
Para pedir
POST
PUT
DELETE
Para añadir
Para actualizar
Para borrar
ejemplo
.get('URL' + '/users')
.get('URL' + '/users/25')
.post('URL' + '/users', body)
.put('URL' + '/users/25', body)
.delete('URL' + '/users/25')
Digamos, que es la forma de apuntar a un recurso en particular
Tiene dos partes claras, el host y el recurso
Indica la acción que queremos hacer desde el front con nuestra solicitud. Son varios:
GET POST PUT DELETE
== DAME LOS USUARIOS =>
Digamos, que es la forma de apuntar a un recurso en particular
Tiene dos partes claras, el host y el recurso
Indica la acción que queremos hacer desde el front con nuestra solicitud. Son varios:
GET POST PUT DELETE
== DAME EL USUARIO CON ID = 5 =>
Digamos, que es la forma de apuntar a un recurso en particular
Tiene dos partes claras, el host y el recurso
Indica la acción que queremos hacer desde el front con nuestra solicitud. Son varios:
GET POST PUT DELETE
== INTRODUCE UN USUARIO NUEVO =>
Digamos, que es la forma de apuntar a un recurso en particular
Tiene dos partes claras, el host y el recurso
Indica la acción que queremos hacer desde el front con nuestra solicitud. Son varios:
GET POST PUT DELETE
== MODIFICA AL USUARIO 5 =>
GET ( URL )
var URL = 'https://jsonplaceholder.typicode.com/users'
GET ( URL + '/25' )
POST ( URL, DATA )
PUT ( URL + '/25', DATA )
DELETE ( URL + '/25' )
1 RECURSO = 1 URL
STANDARD => NOUNS
http://localhost:3000/users
http://localhost:3000/books
http://localhost:3000/books/3
Hay algunos locos que
también usan los sustantivos en singular
import axios from 'axios';
axios.get(url)
axios.post(url, body)
axios.put(url, body)
axios.delete(url)
npm install axios
STANDAR URL NAMES
GET : /USERS
GET : /USERS/:id
POST : /USERS
PUT : /USERS/:id
DELETE : /USERS/:id
LOS DATOS NO ESTARÁN EN LOCAL ESTA VEZ , ESTARÁN EN UN SERVIDOR
axios.get( URL ) axios.post(URL, DATA)
axios.put( URL, DATA ) axios.delete( URL )
COMO TRAER DATOS. Javascript
var urlServer = 'https://jsonplaceholder.typicode.com/users';
axios.get(urlServer)
.then( (users) => {
console.log('Usuarios =' , users.data )
})
.catch( (error) => {
console.log('Algo salio mal =' , error )
})
COMO TRAER DATOS. Javascript
var urlServer = 'https://jsonplaceholder.typicode.com/users/5';
axios.get(urlServer)
.then( (user) => {
console.log('Usuario con id 5 =' , user.data )
})
.catch( (error) => {
console.log('Algo salio mal =' , error )
})
COMO TRAER DATOS. Javascript
var urlServer = 'https://jsonplaceholder.typicode.com/users/5';
axios.get(urlServer)
.then( (user) => {
console.log('Usuario con id 5 =' , user.data )
})
.catch( (error) => {
console.log('Algo salio mal =' , error )
})
COMO TRAER DATOS. Javascript
var urlServer = 'https://jsonplaceholder.typicode.com/users/5';
axios.get(urlServer)
.then( (user) => {
console.log('Usuario con id 5 =' , user.data )
})
.catch( (error) => {
console.log('Algo salio mal =' , error )
})
COMO MANDAR DATOS. Javascript
var urlServer = 'https://jsonplaceholder.typicode.com/users/5';
axios.post(urlServer, newUser)
.then( (user) => {
console.log('Usuario añadido con id =' , user.data.id )
})
.catch( (error) => {
console.log('Algo salio mal =' , error )
})
GET ( URL )
var URL = 'https://jsonplaceholder.typicode.com/users'
GET ( URL + '/25' )
POST ( URL, DATA )
PUT ( URL + '/25', DATA )
DELETE ( URL + '/25' )
¿Por qué then y catch?
ASINCRONÍA
¿Por qué then y catch?
ASINCRONÍA
¿Para que era el then?
¿Cómo usamos nuestro servicio?
Importamos axios en nuestro servicio y lo usamos
Importamos axios en nuestro servicio y lo usamos
IMPORTANTE EL RETURN
Tipar es bueno :)
Tipamos diciendo que vamos a recibir un array de User.
Como usamos nuestro servicio para hacer un GET de los usuarios RESUMEN
app.component.ts
users.service.ts
Como usamos nuestro servicio para hacer un POST de un usuario nuevo
app.component.ts
users.service.ts
VUESTRO TURNO
Ejercicio en grupo
Crea un servicio para descargar los posts que hay en jsonplaceholder
Crea un componente para que cargue todos los posts y los muestre. en la pantalla con un ngFor
Pásale a un componente hijo llamado POST cada item de la lista
https://jsonplaceholder.typicode.com/posts
GET
var URL = 'https://jsonplaceholder.typicode.com/users'
Para pedir
POST
PUT
DELETE
Para añadir
Para actualizar
Para borrar
ejemplo
.get('URL' + '/users')
.get('URL' + '/users/25')
.post('URL' + '/users', body)
.put('URL' + '/users/25', body)
.delete('URL' + '/users/25')
Usando vuestra propia api
- Mete dentro de la base de datos muchas tareas con esta pinta
{
"tasks" : [
{ title : "tarea 1", id : 1} ,
{ title : "tarea 2", id : 2} ,
{ title : "tarea 3", id : 3}
]
}
db.json
desde el frontend.....
Este es el front
no te olvides darle a "Fork"
¡ Puedes usar esta base o partir del vuestro !
Usando vuestra propia api
Reutilizando la base anterior o tu propio proyecto, crea un servicio llamado TasksService para trabajar con "nuestra api".
Debemos realizar las siguientes acciones:
- Obtener todas las tareas.
- Añadir tarea.
- Modificar tarea.
- Borrar una tarea.
Live coding
Ejercicio individual
Simplemente crea un mínimo frontend para mostrar al menos un listado de recursos o dos y para pedir los detalles de esos recursos GET /cats y GET /cats/id por ejemplo
Obviamente realiza el código de traer información de la api con un servicio