Sergio Hidalgo
Apasionado por la tecnología. Ninja Developer, FullStack, Adm Servidores, Profesor de Angular, Node, Phaser, Javascript. sergiohidalgocaceres@gmail.com https://www.facebook.com/groups/607163139705114/
Servicios
Los servicios nos permiten mantener comunicadas diferentes partes del código: Componentes, Directivas, Clases, otros Servicios, etc.
Angular nos permite crear una clase que la usaremos como un servicio. Llamemos a esa clase "LogService" y al archivo "log.service.ts".
<!-- consola.service.ts -->
export enum Estado {
BIEN,
ERROR,
INFO
}
export class ConsolaService {
EscribirEnConsola(accion: Estado, mensaje: string) {
let estilos: string
if(accion===Estado.BIEN) {
estilos = "color: green; font-weight: bold;"
} else if (accion===Estado.ERROR) {
estilos = "color: red; font-weight: bold;"
} else {
estilos = "color: yellow; font-weight: bold;"
}
console.log(`%c ${mensaje}`, estilos)
}
}Y usarlo dentro de un componente por ejemplo, instanciando la clase.
<!-- micomponente.component.ts -->
...
import { Estado, ConsolaService } from "./servicios/consola.service"
...
export class MiComponente {
...
private consola: ConsolaService
constructor(){
this.consola = new ConsolaService()
}
grabar() {
...
this.consola.EscribirEnConsola(Estado.BIEN, "Registro guardado")
}
}Inyectando un servicio
El servicio se puede instanciar desde el constructor sin usar "new".
...
constructor(private consola: ConsolaService) {}
...@Component({
selector: "app-micomponente",
templateUrl: "./app-micomponente.html",
styleUrls: ["./app-micomponente.css"],
providers: [ConsolaService]
})Pero para que funcione dentro de un componente hay que modificar los parámetros del decorador @Component para agregar la propiedad "providers".
Alcance de un servicio
Módulo
El servicio estará disponible para todos los componentes, directivas y servicios vinculados al módulo.
Componente
El servicio estará disponible para el componente y todos sus componentes hijos.
Componente hijo
El servicio estará disponible para el componente hijo y todos sus componentes hijos.
Para inyectar un servicio dentro de otro servicio se necesita usar el decorador @Injectable.
import { Injectable } from "@angular/core"import { Injectable } from "@angular/core"
@Injectable()
export class miServicio {
...
}La clase de servicio se define de la siguiente forma:
Comunicación entre componentes
Para comunicar un componente con otro (u otros) se usa clase EventEmitter.
Se define el emisor dentro de la clase del servicio
onCambio = new EventEmitter<string>()Para emitir:
this.onCambio.emit("prueba")Para recibir:
this.onCambio.subscribe(
data => console.log(data)
)Servicios en Angular6
En Angular6 se ha agregado una nueva forma de declarar un servicio
Hasta Angular5 se declaraba de la siguiente manera:
<!-- mi-servicio.service.ts -->
@Injectable()
export class MiServicio {}
<!-- app.module.ts -->
import { MiServicio } from "./mi-servicio.service.ts"
@NgModule({
...
providers: [MiServicio]
...
})
export class AppModule {}Desde Angular6 se puede declarar también de la siguiente manera:
<!-- mi-servicio.service.ts -->
@Injectable({providedIn: "root"})
export class MiServicio {}
<!-- app.module.ts -->
@NgModule({
...
})
export class AppModule {}Tarea 1
Creen dos listas. La primera tendrá los nombres de usuarios activos y la segunda tendrá los nombres de usuarios inactivos.
Creen dos componentes: Activos (mostrará los usuarios activos) e Inactivos (mostrará los usuarios inactivos)
Cuando se le clic a un usuario activo, debe pasar a la lista de usuarios inactivos, y viceversa.
Tarea 2
Creen una lista de nombres y apellidos de usuarios.
Creen dos componentes: listado y edición.
El componente "listado" mostrará la lista de usuarios.
El componente "edición" permitirá editar el nombre y apellido de un usuario.
El componente "edición" tendrá un botón "Grabar". Mientras no se presione ese botón, el nombre y apellido del usuario no cambiará permanentemente.
Tarea 3
Creen una app para ingresar recetas.
Creen cuatro componentes:
- "Listado de recetas"
- "Formulario" para ingresar una receta
- "Ingrediente" para agregar por separado cada ingrediente
- "Detalle" para mostrar la receta cuando se selecciona una del componente "Listado de recetas"
Cada receta tendrá los siguientes campos: nombre (string), departamento (string), preparación (string) e ingredientes (Array de string).
Usen un modelo para la receta (clase o interface).
Usen un servicio para comunicar los componentes.
Creen una directiva para el select de departamentos.
Tarea 4
Creen una app para consultar y/o modificar la información de alumnos de una universidad.
Creen tres componentes:
- "Listado" de alumnos.
- "Edición" de alumno.
- "Detalle" de alumno
Usen un modelo y un servicio.
Los datos del alumno son: nombre, apellido, carrera.
By Sergio Hidalgo
Servicios: ¿para qué los necesitamos? ¿cómo los usamos?
Apasionado por la tecnología. Ninja Developer, FullStack, Adm Servidores, Profesor de Angular, Node, Phaser, Javascript. sergiohidalgocaceres@gmail.com https://www.facebook.com/groups/607163139705114/