Serviços
Serviços são classes que centralizam lógicas reutilizáveis, como comunicação com APIs, compartilhamento de dados e regras de negócio. São injetados nos componentes por meio da injeção de dependência do Angular.
Exemplo 1 – Serviço de Mensagens
// message.service.ts
import { Injectable } from '@angular/core';
@Injectable({ providedIn: 'root' })
export class MessageService {
messages: string[] = [];
add(message: string) {
this.messages.push(message);
}
clear() {
this.messages = [];
}
}
Usando o Serviço em um Componente
// app.component.ts
import { Component } from '@angular/core';
import { MessageService } from './message.service';
@Component({
selector: 'app-root',
template: `
<button (click)="sendMessage()">Enviar Mensagem</button>
<div *ngFor="let msg of messageService.messages">{{ msg }}</div>
`
})
export class AppComponent {
constructor(public messageService: MessageService) {}
sendMessage() {
this.messageService.add('Nova mensagem em ' + new Date());
}
}
Uso de Requisições HTTP
O Angular possui o módulo HttpClient
para realizar
requisições HTTP como GET
, POST
,
PUT
e DELETE
. Esse módulo permite
comunicação com APIs REST de forma reativa usando Observables. Para
usá-lo, é necessário importar o HttpClientModule
no
módulo principal da aplicação.
// app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HttpClientModule } from '@angular/common/http';
@NgModule({
imports: [BrowserModule, HttpClientModule],
declarations: [/* seus componentes */],
bootstrap: [/* componente principal */]
})
export class AppModule {}
Exemplo 2 – Serviço com Requisição HTTP
// user.service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
@Injectable({ providedIn: 'root' })
export class UserService {
private apiUrl = 'https://jsonplaceholder.typicode.com/users';
constructor(private http: HttpClient) {}
getUsers(): Observable<any[]> {
return this.http.get<any[]>(this.apiUrl);
}
}
Usando o Serviço no Componente
// user-list.component.ts
import { Component, OnInit } from '@angular/core';
import { UserService } from './user.service';
@Component({
selector: 'app-user-list',
template: `
<ul>
<li *ngFor="let user of users">{{ user.name }}</li>
</ul>
`
})
export class UserListComponent implements OnInit {
users: any[] = [];
constructor(private userService: UserService) {}
ngOnInit() {
this.userService.getUsers().subscribe(data => this.users = data);
}
}
Exemplo 3 – Serviço para Compartilhamento de Estado
// counter.service.ts
import { Injectable } from '@angular/core';
@Injectable({ providedIn: 'root' })
export class CounterService {
count = 0;
increment() {
this.count++;
}
decrement() {
this.count--;
}
}
Usando o Serviço em Dois Componentes
// counter-display.component.ts
import { Component } from '@angular/core';
import { CounterService } from './counter.service';
@Component({
selector: 'app-counter-display',
template: `<p>Contador: {{ counterService.count }}</p>`
})
export class CounterDisplayComponent {
constructor(public counterService: CounterService) {}
}
// counter-controls.component.ts
import { Component } from '@angular/core';
import { CounterService } from './counter.service';
@Component({
selector: 'app-counter-controls',
template: `
<button (click)="counterService.increment()">+</button>
<button (click)="counterService.decrement()">-</button>
`
})
export class CounterControlsComponent {
constructor(public counterService: CounterService) {}
}