Servicios y Dependencias en Angular v18
Servicios en Angular son clases que se utilizan para encapsular lógica y datos que se pueden compartir entre diferentes componentes de la aplicación. Los servicios permiten la separación de preocupaciones y fomentan la reutilización del código.
Dependencias en Angular se refieren a los objetos que una clase necesita para funcionar. La Inyección de Dependencias (DI) es un patrón de diseño que Angular utiliza para proporcionar instancias de servicios a los componentes y otras clases.
DataService: Es un tipo de servicio específico que se utiliza para manejar la comunicación con fuentes de datos, como APIs REST, bases de datos locales, etc.
Componentes de Servicios y Dependencias en Angular v18
- Service Class: Clase que contiene lógica y datos compartidos.
- Injectable Decorator: Decorador que marca una clase como elegible para la inyección de dependencias.
- Injector: Mecanismo que proporciona las instancias de las dependencias.
- Provider: Configuración que define cómo se crea o encuentra una dependencia.
- Dependency Injection: Sistema que Angular usa para inyectar dependencias en componentes y otros servicios.
- HttpClient: Servicio que facilita la comunicación HTTP con servidores remotos.
Videotutoriales:
- Curso Angular 2023 #7 Servicios En Angular: https://youtu.be/I1O7PALWzxo
- Angular (v18): Servicios https://youtu.be/e4U6EVCnjFY
- Servicios e Inyección de Dependencias https://youtu.be/aWroeRO3bRQ
- Servicios en Angular: https://youtu.be/Lez9ZAEAYsM
- Servicios e Inyección de Dependencias https://youtu.be/MVR4VmbiEzo
- Inyección de dependencias | Angular https://youtu.be/ONtQ8r0sxCw
Interpretación de cada componente
Service Class:
- Define la lógica que se compartirá entre componentes: contiene lógica y datos compartidos.
- Define la lógica que se compartirá entre componentes: contiene lógica y datos compartidos.
// typescript
export class DataService {
getData() {
return ['data1', 'data2', 'data3'];
}
}
2- Injectable Decorator:
- Marca una clase como elegible para la inyección de dependencias.
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root',
})
export class DataService {
getData() {
return ['data1', 'data2', 'data3'];
}
}
Injector:
- Mecanismo utilizado por Angular para crear y proporcionar instancias de dependencias.
- Generalmente no se usa directamente por los desarrolladores, se maneja automáticamente por Angular.
Provider:
- Registra el servicio para la inyección de dependencias.
- Configuración que indica cómo Angular debe crear o buscar una dependencia.
- Puede ser configurado en módulos, componentes o servicios.
@NgModule({
providers: [DataService]
})
Inject Decorator:
- Especifica qué dependencia inyectar.
import { Inject } from '@angular/core';
constructor(@Inject(DataService) private dataService) {}
Dependency Injection:
- Mecanismo para inyectar dependencias en clases.
constructor(private myService: MyService) {}
HttpClient::
Servicio para realizar peticiones HTTP.
constructor(private http: HttpClient) {}
getData() {
return this.http.get('https://api.example.com/data');
}
Ejemplo de Servicios y Dependencias en Angular v18
Este ejemplo muestra cómo definir un servicio en Angular, cómo
inyectarlo en un componente y cómo utilizarlo para manejar datos
compartidos. La clase DataService
encapsula la lógica para gestionar los datos, mientras que el componente AppComponent
consume el servicio para mostrar y añadir datos.
Configuración del servicio:
// data.service.ts
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root',
})
export class DataService {
private data: string[] = ['data1', 'data2', 'data3'];
getData(): string[] {
return this.data;
}
addData(newData: string): void {
this.data.push(newData);
}
}
Componente Angular que consume el servicio:
// app.component.ts
import { Component, OnInit } from '@angular/core';
import { DataService } from './data.service';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent implements OnInit {
data: string[];
users: any[] = [];
newUser = { name: '', email: '' };
constructor(private dataService: DataService) {}
ngOnInit(): void {
this.data = this.dataService.getData();
this.loadUsers();
}
addData(newData: string): void {
this.dataService.addData(newData);
this.data = this.dataService.getData();
}
loadUsers() {
this.dataService.getUsers().subscribe((data) => {
this.users = data;
});
}
addUser() {
this.dataService.addUser(this.newUser).subscribe((user) => {
this.users.push(user);
this.newUser = { name: '', email: '' };
});
}
}
Plantilla HTML del componente:
<!-- app.component.html -->
<div>
<h1>Data List</h1>
<ul>
<li *ngFor="let item of data">{{ item }}</li>
</ul>
<input #newDataInput type="text" placeholder="Add new data">
<button (click)="addData(newDataInput.value)">Add Data</button>
</div>
<!-- app.component.html -->
<div>
<h1>User List</h1>
<ul>
<li *ngFor="let user of users">{{ user.name }} ({{ user.email }})</li>
</ul>
<h2>Add New User</h2>
<form (ngSubmit)="addUser()">
<label for="name">Name:</label>
<input id="name" [(ngModel)]="newUser.name" name="name" required>
<label for="email">Email:</label>
<input id="email" [(ngModel)]="newUser.email" name="email" required>
<button type="submit">Add User</button>
</form>
</div>
Configuración del módulo:
// app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HttpClientModule } from '@angular/common/http';
import { AppComponent } from './app.component';
import { DataService } from './data.service';
@NgModule({
declarations: [AppComponent],
imports: [BrowserModule, HttpClientModule],
providers: [DataService],
bootstrap: [AppComponent],
})
export class AppModule {}
Servicio Angular:
// data.service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class DataService {
private apiUrl = 'http://localhost:3000/users';
constructor(private http: HttpClient) {}
getUsers(): Observable {
return this.http.get(this.apiUrl);
}
addUser(user: any): Observable {
return this.http.post(this.apiUrl, user);
}
}
Configuración del servidor backend con JSON Server:
Este código de Angular junto con el JSON Server permite crear y gestionar un formulario reactivo que guarda los datos en una base de datos local simulada.
1- Instala JSON Server:
// bash
npm install -g json-server
2- Crea un archivo db.json
en la raíz de tu proyecto con el siguiente contenido:
// json
{ "users": [] }
3- Inicia JSON Server:
// bash
json-server --watch db.json --port 3000
mmm