En aquest tema, aprendrem com crear i utilitzar serveis en Angular. Els serveis són una part fonamental de qualsevol aplicació Angular, ja que permeten encapsular la lògica de negoci i compartir dades entre components de manera eficient.
Objectius
- Entendre què és un servei en Angular.
- Aprendre a crear un servei.
- Injectar i utilitzar un servei en un component.
- Compartir dades entre components mitjançant serveis.
Què és un servei en Angular?
Un servei en Angular és una classe que encapsula una lògica específica que es pot compartir entre diferents components de l'aplicació. Els serveis es creen per:
- Gestionar dades.
- Realitzar operacions de xarxa.
- Implementar lògica de negoci.
- Facilitar la reutilització del codi.
Creació d'un servei
Pas 1: Crear el servei
Per crear un servei, podem utilitzar l'Angular CLI. Executem la següent comanda en el terminal:
Això generarà dos fitxers:
my-service.service.ts
: Conté la definició del servei.my-service.service.spec.ts
: Conté les proves unitàries per al servei.
Pas 2: Definir la lògica del servei
Obrim el fitxer my-service.service.ts
i afegim la lògica necessària. Per exemple, crearem un servei que gestiona una llista de tasques:
import { Injectable } from '@angular/core'; @Injectable({ providedIn: 'root' }) export class MyService { private tasks: string[] = []; constructor() { } addTask(task: string): void { this.tasks.push(task); } getTasks(): string[] { return this.tasks; } clearTasks(): void { this.tasks = []; } }
Explicació del codi
@Injectable({ providedIn: 'root' })
: Aquest decorador indica que el servei es pot injectar en qualsevol part de l'aplicació.providedIn: 'root'
fa que el servei estigui disponible a nivell global.tasks
: Una propietat privada que emmagatzema les tasques.addTask(task: string)
: Afegeix una tasca a la llista.getTasks()
: Retorna la llista de tasques.clearTasks()
: Neteja la llista de tasques.
Utilització d'un servei en un component
Pas 1: Injectar el servei
Per utilitzar el servei en un component, primer l'hem d'injectar en el constructor del component. Obrim el fitxer del component, per exemple app.component.ts
, i afegim el servei al constructor:
import { Component } from '@angular/core'; import { MyService } from './my-service.service'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent { tasks: string[] = []; constructor(private myService: MyService) { } ngOnInit(): void { this.tasks = this.myService.getTasks(); } addTask(task: string): void { this.myService.addTask(task); this.tasks = this.myService.getTasks(); } clearTasks(): void { this.myService.clearTasks(); this.tasks = []; } }
Explicació del codi
constructor(private myService: MyService)
: Injecta el servei en el component.ngOnInit()
: Obté la llista de tasques quan el component s'inicialitza.addTask(task: string)
: Afegeix una tasca mitjançant el servei i actualitza la llista de tasques.clearTasks()
: Neteja la llista de tasques mitjançant el servei.
Pas 2: Actualitzar la plantilla
Actualitzem la plantilla del component, per exemple app.component.html
, per interactuar amb el servei:
<div> <h1>Llista de Tasques</h1> <input #taskInput type="text" placeholder="Nova tasca"> <button (click)="addTask(taskInput.value); taskInput.value=''">Afegeix Tasca</button> <button (click)="clearTasks()">Neteja Tasques</button> <ul> <li *ngFor="let task of tasks">{{ task }}</li> </ul> </div>
Explicació del codi
#taskInput
: Una referència local per obtenir el valor de l'input.(click)="addTask(taskInput.value); taskInput.value=''
": Afegeix una tasca i neteja l'input.(click)="clearTasks()"
: Neteja la llista de tasques.*ngFor="let task of tasks"
: Itera sobre la llista de tasques i les mostra en una llista no ordenada.
Exercici pràctic
Exercici
- Crea un nou servei anomenat
UserService
que gestioni una llista d'usuaris. - Defineix les següents funcions en el servei:
addUser(user: string)
: Afegeix un usuari a la llista.getUsers()
: Retorna la llista d'usuaris.clearUsers()
: Neteja la llista d'usuaris.
- Injecta el servei en un component i utilitza'l per gestionar una llista d'usuaris en la interfície d'usuari.
Solució
user.service.ts
import { Injectable } from '@angular/core'; @Injectable({ providedIn: 'root' }) export class UserService { private users: string[] = []; constructor() { } addUser(user: string): void { this.users.push(user); } getUsers(): string[] { return this.users; } clearUsers(): void { this.users = []; } }
app.component.ts
import { Component } from '@angular/core'; import { UserService } from './user.service'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent { users: string[] = []; constructor(private userService: UserService) { } ngOnInit(): void { this.users = this.userService.getUsers(); } addUser(user: string): void { this.userService.addUser(user); this.users = this.userService.getUsers(); } clearUsers(): void { this.userService.clearUsers(); this.users = []; } }
app.component.html
<div> <h1>Llista d'Usuaris</h1> <input #userInput type="text" placeholder="Nou usuari"> <button (click)="addUser(userInput.value); userInput.value=''">Afegeix Usuari</button> <button (click)="clearUsers()">Neteja Usuaris</button> <ul> <li *ngFor="let user of users">{{ user }}</li> </ul> </div>
Conclusió
En aquest tema, hem après a crear i utilitzar serveis en Angular. Els serveis ens permeten encapsular la lògica de negoci i compartir dades entre components de manera eficient. Hem vist com crear un servei, injectar-lo en un component i utilitzar-lo per gestionar dades. A més, hem practicat aquests conceptes amb un exercici pràctic. En el proper tema, explorarem la injecció de dependències en més detall.
Curs d'Angular 2+
Mòdul 1: Introducció a Angular
- Què és Angular?
- Configuració de l'entorn de desenvolupament
- La teva primera aplicació Angular
- Arquitectura d'Angular
Mòdul 2: Conceptes bàsics de TypeScript
- Introducció a TypeScript
- Variables i tipus de dades en TypeScript
- Funcions i funcions fletxa
- Classes i interfícies
Mòdul 3: Components i plantilles
Mòdul 4: Directives i pipes
Mòdul 5: Serveis i injecció de dependències
Mòdul 6: Enrutament i navegació
Mòdul 7: Formularis en Angular
Mòdul 8: Client HTTP i observables
- Introducció al client HTTP
- Realització de sol·licituds HTTP
- Gestió de respostes HTTP
- Ús d'observables