Observable e a biblioteca RxJS - Angular
Os métodos da classe HttpClient
Observable<any>
HttpClient
Para utilizar as funcionalidades da RxJS na sua aplicação, é necessário instalar a biblioteca. Para isso, execute o seguinte comando no terminal:
npm install rxjs
Além disso, como foi mencionado no tema anterior, é necessário importar provideHttpClient
main.ts
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app/app.component';
import { provideHttpClient } from '@angular/common/http';
bootstrapApplication(AppComponent, { providers: [provideHttpClient()] }).catch(
(err) => console.error(err)
);
Ao utilizar métodos especiais para o objeto Observable
map
filter
Por exemplo, vamos usar o projeto do tema anterior, com a seguinte estrutura:
helloapp/ ├── src/ │ ├── app/ │ │ ├── app.component.ts │ │ ├── user.ts │ ├── assets/ │ │ ├── data.json │ ├── main.ts │ ├── index.html ├── angular.json ├── package-lock.json ├── package.json └── tsconfig.json
No arquivo data.json
User
{
"userList": [
{
"userName": "Bob",
"userAge": 28
},
{
"userName": "Tom",
"userAge": 39
},
{
"userName": "Alice",
"userAge": 32
}
]
}
Como modelo de dados, usaremos a classe User
user.ts
export class User {
constructor(public name: string, public age: number) {}
}
Nesse caso, não há correspondência direta entre os nomes das propriedades: name
userName
age
userAge
No arquivo http.service.ts
data.json
import { Injectable } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { User } from "./user";
import { Observable } from "rxjs";
import { map } from "rxjs/operators";
@Injectable()
export class HttpService {
constructor(private http: HttpClient) {}
getUsers(): Observable<User[]> {
return this.http.get("assets/data.json").pipe(
map((data: any) => {
let usersList = data["userList"];
return usersList.map(function(user: any): User {
return new User(user.userName, user.userAge);
});
})
);
}
}
O propósito de usar um serviço especializado para lidar com HTTP é ocultar os detalhes do envio de requisições. O componente espera receber dados específicos, como uma coleção de objetos User
Após a execução do método get()
pipe()
map
Para usar os elementos da biblioteca RxJS, é necessário importá-los:
import { Observable } from "rxjs";
import { map } from "rxjs/operators";
No final, o método getUsers()
Observable<User[]>
Agora, vamos utilizar o serviço no componente da aplicação:
import { Component, OnInit } from '@angular/core';
import { HttpService } from './http.service';
import { User } from './user';
@Component({
selector: 'my-app',
standalone: true,
imports: [],
template: `<ul>
@for(user of users; track $index) {
<li>{{ user?.name }} ({{ user?.age }})</li>
}
</ul>`,
providers: [HttpService],
})
export class AppComponent implements OnInit {
users: User[] = [];
constructor(private httpService: HttpService) {}
ngOnInit() {
this.httpService.getUsers().subscribe({
next: (data: User[]) => (this.users = data),
});
}
}
Neste código, o serviço HttpService
AppComponent
