*** Extraits de code : Effectuer des traitements asynchrones avec RxJS. ***
import { Component, OnInit } from "@angular/core";
import { Router } from "@angular/router";
import { debounceTime, distinctUntilChanged, switchMap } from "rxjs/operators";
import { Observable, Subject, of } from "rxjs";
import { PokemonsService } from "./pokemons.service";
import { Pokemon } from "./pokemon";
@Component({
selector: "pokemon-search",
templateUrl: "./app/pokemons/search-pokemon.component.html",
})
export class PokemonSearchComponent implements OnInit {
private searchTerms = new Subject<string>();
pokemons$: Observable<Pokemon[]>;
constructor(
private pokemonsService: PokemonsService,
private router: Router
) {}
// Ajoute un terme de recherche dans le flux de l'Observable 'searchTerms'
search(term: string): void {
this.searchTerms.next(term);
}
ngOnInit(): void {
this.pokemons$ = this.searchTerms.pipe(
// attendre 300ms de pause entre chaque requête
debounceTime(300),
// ignorer la recherche en cours si c'est la même que la précédente
distinctUntilChanged(),
// on retourne la liste des résultats correpsondant aux termes de la recherche
switchMap((term: string) => this.pokemonsService.searchPokemons(term))
);
}
gotoDetail(pokemon: Pokemon): void {
let link = ["/pokemon", pokemon.id];
this.router.navigate(link);
}
}
<div class="row">
<div class="col s12 m6 offset-m3">
<div class="card">
<div class="card-content">
<div class="input-field">
<input #searchBox (keyup)="search(searchBox.value)"
placeholder="Rechercher un pokémon"/>
</div>
<div class="collection">
<a *ngFor="let pokemon of pokemons$ | async"
(click)="gotoDetail(pokemon)" class="collection-item">
{{ pokemon.name }}
</a>
</div>
</div>
</div>
</div>
</div>
import { Component } from '@angular/core';
@Component({
selector: 'pkmn-loader',
template: `
<div class="preloader-wrapper big active">
<div class="spinner-layer spinner-blue">
<div class="circle-clipper left">
<div class="circle"></div>
</div><div class="gap-patch">
<div class="circle"></div>
</div><div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
</div>
`
})
export class LoaderComponent {}