Récupérer à l’avance signifie obtenir les données avant qu’elles ne soient affichées à l’écran. Dans cet article, vous apprendrez comment obtenir des données avant les modifications de routage. Grâce à cet article, vous apprendrez à utiliser resolver
, à appliquer resolver
dans Angular App
et à les appliquer à une navigation commune préchargée. [Recommandation de didacticiel associée : "tutoriel angulaire"]
Resolver
Resolver
joue le rôle d'un service middleware entre le routage et les composants. Supposons que vous ayez un formulaire sans données et que vous souhaitiez présenter un formulaire vide à l'utilisateur, afficher un loader
pendant le chargement des données utilisateur, puis lorsque les données sont renvoyées, remplir le formulaire et masquer loader
.
Habituellement, nous obtenons des données dans la fonction hook ngOnInit()
du composant. En d'autres termes, une fois le composant chargé, nous lançons une demande de données.
En opérant dans ngOnInit()
, nous devons ajouter l'affichage loader
à sa page de routage après le chargement de chaque composant requis. Resolver
peut simplifier l'ajout et l'utilisation de loader
. Au lieu d'ajouter loader
à chaque itinéraire, vous pouvez simplement ajouter un loader
pour chaque itinéraire.
Cet article utilisera des exemples pour analyser les points de connaissance du resolver
. Pour que vous puissiez vous en souvenir et l'utiliser dans vos projets.
Resolver
dans les applicationsAfin d'utiliser resolver
dans les applications, vous devez préparer certaines interfaces. Vous pouvez le simuler via JSONPlaceholder sans le développer vous-même.
JSONPlaceholder
est une excellente ressource d'interface. Vous pouvez l'utiliser pour mieux apprendre les concepts associés du front-end sans être contraint par l'interface.
Maintenant que le problème d’interface est résolu, nous pouvons démarrer l’application resolver
. Un resolver
est un service middleware, nous allons donc créer un service.
$ ng gs solvers/demo-resolver --skipTests=true
--skipTests=true ignore la génération des fichiers de test
Un service est créé dans src/app/resolvers
. Il existe une méthode resolve()
dans l'interface resolver
, qui a deux paramètres : route
(une instance de ActivatedRouteSnapshot
) et state
(une instance de RouterStateSnapshot
).
loader
écrit généralement toutes les requêtes AJAX
dans ngOnInit()
, mais la logique sera implémentée dans resolver
au lieu de ngOnInit()
.
Ensuite, créez un service pour obtenir les données de la liste dans JSONPlaceholder
. Appelez-le ensuite dans resolver
, puis configurez resolve
dans la route (la page attendra) jusqu'à ce que resolver
soit traité. Une fois resolver
traité, nous pouvons obtenir les données par routage et les afficher dans le composant.
$ ng gs services/posts --skipTests=true
Maintenant que nous avons créé le service avec succès, il est temps d'écrire la logique d'une requête AJAX
.
L'utilisation de model
peut nous aider à réduire les erreurs.
$ ng g class models/post --skipTests=true
post.ts
export class Post { id: number; titre : chaîne ; corps : chaîne ; ID utilisateur : chaîne ; }
model
est prêt, il est temps de récupérer les données post
.
post.service.ts
import { Injectable } depuis "@angular/core" ; importer { HttpClient } depuis "@angular/common/http" ; importer {Post} depuis "../models/post" ; @Injectable({ fourni dans : "root" }) classe d'exportation PostsService { constructeur (privé _http : HttpClient) {} getPostList() { laissez URL = "https://jsonplaceholder.typicode.com/posts" ; renvoie this._http.get<Post[]>(URL); } }
Désormais, ce service peut être appelé à tout moment.
demo-resolver.service.ts
import {Injectable} depuis "@angular/core" ; importer { Résoudre, ActivatedRouteSnapshot, RouterStateSnapshot } de "@angular/router" ; importer { PostsService } depuis "../services/posts.service" ; @Injectable({ fourni dans : "root" }) classe d'exportation DemoResolverService implémente Resolve<any> { constructeur (privé _postsService : PostsService) {} résoudre (route : ActivatedRouteSnapshot, état : RouterStateSnapshot) { renvoie this._postsService.getPostList(); } }
Données de la liste de publications renvoyées par resolver
. Maintenant, vous avez besoin d'une route pour configurer resolver
, obtenir les données de la route, puis afficher les données dans le composant. Afin d'effectuer des sauts de routage, nous devons créer un composant.
$ ng gc composants/post-list --skipTests=true
Pour rendre l'itinéraire visible, ajoutez router-outlet
dans app.component.ts
.
<router-outlet></router-outlet>
Vous pouvez maintenant configurer le fichier app-routing.module.ts
. L'extrait de code suivant vous aidera à comprendre le resolver
de configuration de route.
app-routing-module.ts
import { NgModule } depuis "@angular/core" ; importer { Routes, RouterModule } depuis "@angular/router" ; importer { PostListComponent } depuis "./components/post-list/post-list.component" ; importer { DemoResolverService } depuis "./resolvers/demo-resolver.service" ; const routes : Routes = [ { chemin : "messages", composant : PostListComponent, résoudre: { messages : DemoResolverService } }, { chemin: "", redirectTo : "messages", pathMatch : "complet" } ]; @NgModule({ importations : [RouterModule.forRoot(routes)], exportations : [RouterModule] }) export class AppRoutingModule {}
Une resolve
a été ajoutée à la configuration de routage, qui lancera une requête HTTP
, puis permettra au composant de s'initialiser lorsque HTTP
sera renvoyée avec succès. La route rassemblera les données renvoyées par HTTP
.
pour montrer à l'utilisateur qu'une requête est en cours, nous écrivons un loader
public et simple dans AppComponent
. Vous pouvez le personnaliser selon vos besoins.
app.component.html
<div class="loader" *ngIf="isLoader"> <div>Chargement...</div> </div> <router-outlet></router-outlet>
app.component.ts
import { Component } depuis "@angular/core" ; importer { Routeur, Événement de routeur, NavigationDémarrer, NavigationFin } de "@angular/router" ; @Composant({ sélecteur : "app-root", templateUrl : "./app.component.html", styleUrls : ["./app.component.scss"] }) classe d'exportation AppComponent { isLoader : booléen ; constructeur (private_router : routeur) {} ngOnInit() { this.routerEvents(); } routeurEvents() { this._router.events.subscribe((événement : RouterEvent) => { changer (vrai) { instance d'événement de cas de NavigationStart : { this.isLoader = true ; casser; } instance d'événement de cas de NavigationEnd : { this.isLoader = faux ; casser; } } }); } }
Lorsque la navigation démarre, isLoader
est affectée true
et vous verrez l'effet suivant sur la page.
Une fois le traitement terminé, resolver
sera masqué.
Il est maintenant temps d'obtenir la valeur de l'itinéraire et de l'afficher.
port-list.component.ts
import { Composant, OnInit } depuis "@angular/core" ; importer {Routeur, ActivatedRoute } depuis "@angular/router" ; importer { Post } depuis "src/app/models/post" ; @Composant({ sélecteur : "app-post-list", templateUrl : "./post-list.component.html", styleUrls : ["./post-list.component.scss"] }) classe d'exportation PostListComponent implémente OnInit { messages : Publier[] ; constructeur (private _route : ActivatedRoute) { this.posts = []; } ngOnInit() { this.posts = this._route.snapshot.data["posts"]; } }
Comme indiqué ci-dessus, la valeur de post
provient des data
d'informations d'instantané de ActivatedRoute
. Ces deux valeurs peuvent être obtenues à condition de configurer les mêmes informations dans l'itinéraire.
Nous rendons comme suit en HTML
.
<div class="post-list grille-conteneur"> <div class="card" *ngFor="laisser publier des messages"> <div class="title"><b>{{post?.title}}</b></div> <div class="body">{{post.body}}</div> </div> </div>
Les styles de fragments CSS
le rendent plus beau.
liste de ports.component.css
.grid-container { affichage : grille ; colonnes-modèles de grille : calc(100% / 3) calc(100% / 3) calc(100% / 3); } .carte { marge : 10px ; boîte-ombre : noir 0 0 2px 0px ; remplissage : 10 px ; }
Il est recommandé d'utiliser le préprocesseur scss pour écrire les styles.
Après avoir obtenu les données de l'itinéraire, elles seront affichées en HTML
. L'effet est le suivant : instantané.
À ce stade, vous avez appris à utiliser resolver
dans votre projet.
En combinaison avec la conception de l'expérience utilisateur et avec l'aide du resolver
, vous pouvez améliorer les performances de votre application. Pour en savoir plus, vous pouvez visiter le site officiel.
Cet article est une traduction, utilisant une traduction gratuite, avec une compréhension personnelle et des commentaires ajoutés. L'adresse originale est :
https://www.pluralsight.com/guides/prefetching-data-for-an-angular-route.