En Angular, los servicios son una forma de compartir datos y lógica entre diferentes partes de una aplicación. Los servicios permiten que los componentes sean más limpios y enfocados en la presentación, delegando la lógica de negocio y la gestión de datos a los servicios.
¿Qué es un Servicio en Angular?
Un servicio en Angular es una clase que se puede inyectar en componentes y otros servicios usando el sistema de inyección de dependencias de Angular. Los servicios se utilizan para encapsular lógica de negocio, realizar operaciones de red, gestionar datos compartidos, entre otras tareas.
Ventajas de Usar Servicios
- Reutilización de Código: Los servicios permiten reutilizar lógica de negocio en diferentes partes de la aplicación.
- Separación de Responsabilidades: Los componentes se enfocan en la presentación, mientras que los servicios manejan la lógica de negocio.
- Facilidad de Pruebas: Los servicios pueden ser fácilmente probados de manera aislada.
Creación de un Servicio
Para crear un servicio en Angular, puedes usar el Angular CLI. El comando para generar un servicio es:
Por ejemplo, para crear un servicio llamado data
, puedes ejecutar:
Esto generará dos archivos:
data.service.ts
: Contiene la definición del servicio.data.service.spec.ts
: Contiene las pruebas unitarias para el servicio.
Ejemplo de Servicio
A continuación, se muestra un ejemplo básico de un servicio que maneja datos de usuarios:
import { Injectable } from '@angular/core'; @Injectable({ providedIn: 'root' }) export class DataService { private users: string[] = ['Alice', 'Bob', 'Charlie']; constructor() { } getUsers(): string[] { return this.users; } addUser(user: string): void { this.users.push(user); } }
En este ejemplo:
@Injectable({ providedIn: 'root' })
: Este decorador indica que el servicio debe ser proporcionado en el nivel raíz, lo que significa que estará disponible en toda la aplicación.getUsers()
: Método para obtener la lista de usuarios.addUser(user: string)
: Método para agregar un nuevo usuario a la lista.
Uso de Servicios en Componentes
Para usar un servicio en un componente, primero debes inyectarlo en el constructor del componente.
Ejemplo de Uso de Servicio en un Componente
Supongamos que tienes un componente llamado UserComponent
y quieres usar el DataService
para mostrar y agregar usuarios.
import { Component, OnInit } from '@angular/core'; import { DataService } from './data.service'; @Component({ selector: 'app-user', template: ` <div> <h2>Users</h2> <ul> <li *ngFor="let user of users">{{ user }}</li> </ul> <input [(ngModel)]="newUser" placeholder="Add a user"> <button (click)="addUser()">Add</button> </div> `, styles: [] }) export class UserComponent implements OnInit { users: string[] = []; newUser: string = ''; constructor(private dataService: DataService) { } ngOnInit(): void { this.users = this.dataService.getUsers(); } addUser(): void { if (this.newUser) { this.dataService.addUser(this.newUser); this.newUser = ''; this.users = this.dataService.getUsers(); } } }
En este ejemplo:
DataService
se inyecta en el constructor del componente.ngOnInit()
: Método del ciclo de vida del componente que se ejecuta después de que Angular inicializa las propiedades del componente. Aquí se obtiene la lista de usuarios del servicio.addUser()
: Método que agrega un nuevo usuario usando el servicio y actualiza la lista de usuarios.
Ejercicio Práctico
Ejercicio
- Crea un nuevo servicio llamado
product
. - En el servicio
ProductService
, define un métodogetProducts()
que devuelva una lista de productos. - Crea un componente llamado
ProductComponent
. - Inyecta el
ProductService
en elProductComponent
y usa el métodogetProducts()
para mostrar la lista de productos en la plantilla del componente.
Solución
- Crear el servicio
ProductService
:
- Definir el método
getProducts()
enProductService
:
import { Injectable } from '@angular/core'; @Injectable({ providedIn: 'root' }) export class ProductService { private products: string[] = ['Product1', 'Product2', 'Product3']; constructor() { } getProducts(): string[] { return this.products; } }
- Crear el componente
ProductComponent
:
- Inyectar
ProductService
enProductComponent
y usargetProducts()
:
import { Component, OnInit } from '@angular/core'; import { ProductService } from '../product.service'; @Component({ selector: 'app-product', template: ` <div> <h2>Products</h2> <ul> <li *ngFor="let product of products">{{ product }}</li> </ul> </div> `, styles: [] }) export class ProductComponent implements OnInit { products: string[] = []; constructor(private productService: ProductService) { } ngOnInit(): void { this.products = this.productService.getProducts(); } }
Conclusión
En esta sección, hemos aprendido cómo crear y usar servicios en Angular. Los servicios son fundamentales para mantener la lógica de negocio separada de los componentes, lo que facilita la reutilización del código y la realización de pruebas. En el próximo módulo, exploraremos la inyección de dependencias en mayor detalle, lo que nos permitirá comprender mejor cómo Angular gestiona la creación y el suministro de servicios.
Curso de Angular 2+
Módulo 1: Introducción a Angular
- ¿Qué es Angular?
- Configuración del Entorno de Desarrollo
- Tu Primera Aplicación Angular
- Arquitectura de Angular
Módulo 2: Conceptos Básicos de TypeScript
- Introducción a TypeScript
- Variables y Tipos de Datos en TypeScript
- Funciones y Funciones Flecha
- Clases e Interfaces
Módulo 3: Componentes y Plantillas
- Creación de Componentes
- Plantillas de Componentes
- Estilos de Componentes
- Interacción entre Componentes
Módulo 4: Directivas y Pipes
Módulo 5: Servicios e Inyección de Dependencias
- Introducción a los Servicios
- Creación y Uso de Servicios
- Inyección de Dependencias
- Inyectores Jerárquicos
Módulo 6: Enrutamiento y Navegación
Módulo 7: Formularios en Angular
- Formularios Basados en Plantillas
- Formularios Reactivos
- Validación de Formularios
- Formularios Dinámicos
Módulo 8: Cliente HTTP y Observables
- Introducción al Cliente HTTP
- Realizando Solicitudes HTTP
- Manejo de Respuestas HTTP
- Uso de Observables
Módulo 9: Gestión de Estado
- Introducción a la Gestión de Estado
- Uso de Servicios para la Gestión de Estado
- NgRx Store
- NgRx Effects