Obtener con anticipación significa obtener los datos antes de que se muestren en la pantalla. En este artículo, aprenderá cómo obtener datos antes de cambios de ruta. A través de este artículo, aprenderá a usar resolver
, resolver
en Angular App
y aplicarlos a una navegación precargada común. [Recomendación de tutorial relacionado: "tutorial angular"]
Resolver
Resolver
desempeña el papel de un servicio de middleware entre el enrutamiento y los componentes. Suponga que tiene un formulario sin datos y desea presentar un formulario vacío al usuario, mostrar un loader
mientras se cargan los datos del usuario y luego, cuando se devuelven los datos, completar el formulario y ocultar loader
.
Por lo general, obtenemos datos en la función de enlace ngOnInit()
del componente. En otras palabras, una vez cargado el componente, iniciamos una solicitud de datos.
Al operar en ngOnInit()
, necesitamos agregar la visualización loader
a su página de enrutamiento después de cargar cada componente requerido. Resolver
puede simplificar la adición y el uso de loader
. En lugar de agregar loader
a cada ruta, puede simplemente agregar un loader
para cada ruta.
Este artículo utilizará ejemplos para analizar los puntos de conocimiento del resolver
. Para que puedas recordarlo y utilizarlo en tus proyectos.
Resolver
en aplicacionesPara utilizar resolver
en aplicaciones, es necesario preparar algunas interfaces. Puedes simularlo a través de JSONPlaceholder sin desarrollarlo tú mismo.
JSONPlaceholder
es un excelente recurso de interfaz. Puede usarlo para aprender mejor conceptos relacionados del front-end sin estar limitado por la interfaz.
Ahora que el problema de la interfaz está resuelto, podemos iniciar la aplicación resolver
. Un resolver
es un servicio de middleware, por lo que crearemos un servicio.
$ ng gs resolvers/demo-resolver --skipTests=true
--skipTests=true omite la generación de archivos de prueba
. Se crea un servicio en src/app/resolvers
. Hay un método resolve()
en la interfaz resolver
, que tiene dos parámetros: route
(una instancia de ActivatedRouteSnapshot
) y state
(una instancia de RouterStateSnapshot
).
loader
generalmente escribe todas las solicitudes AJAX
en ngOnInit()
, pero la lógica se implementará en resolver
en lugar de ngOnInit()
.
A continuación, cree un servicio para obtener los datos de la lista en JSONPlaceholder
. Luego llámelo en resolver
y luego configure resolve
en la ruta (la página esperará) hasta que se procese resolver
. Una vez procesado resolver
, podemos obtener los datos mediante el enrutamiento y mostrarlos en el componente.
$ ng gs services/posts --skipTests=true
Ahora que hemos creado exitosamente el servicio, es hora de escribir la lógica para una solicitud AJAX
.
El uso de model
puede ayudarnos a reducir errores.
$ ng g modelos de clase/publicación --skipTests=true
post.ts
export class Publicación { id: número; título: cadena; cuerpo: cuerda; ID de usuario: cadena; }
model
está listo, es hora de obtener los datos post
.
post.service.ts
importa {Inyectable} desde "@angular/core"; importar { HttpClient } desde "@angular/common/http"; importar { Publicación } desde "../modelos/publicación"; @Inyectable({ proporcionado en: "raíz" }) exportar clase PostsService { constructor(privado _http: HttpClient) {} getPostList() { let URL = "https://jsonplaceholder.typicode.com/posts"; devuelve this._http.get<Post[]>(URL); } }
Ahora, este servicio se puede llamar en cualquier momento.
demo-resolver.service.ts
importa {Inyectable} desde "@angular/core"; importar { Resolver, Instantánea de ruta activada, Instantánea del estado del enrutador } de "@angular/router"; importar {PostsService} desde "../services/posts.service"; @Inyectable({ proporcionado en: "raíz" }) la clase de exportación DemoResolverService implementa Resolve<cualquier> { constructor (privado _postsService: PostsService) {} resolver (ruta: ActivatedRouteSnapshot, estado: RouterStateSnapshot) { devolver this._postsService.getPostList(); } }
Datos de la lista de publicaciones devueltos por resolver
. Ahora, necesita una ruta para configurar resolver
, obtener los datos de la ruta y luego mostrar los datos en el componente. Para realizar saltos de enrutamiento, necesitamos crear un componente.
$ ng gc componentes/post-list --skipTests=true
Para que la ruta sea visible, agregue router-outlet
en app.component.ts
.
<router-outlet></router-outlet>
Ahora puede configurar el archivo app-routing.module.ts
. El siguiente fragmento de código le ayudará a comprender el resolver
de configuración de ruta.
app-routing-module.ts
importa {NgModule} desde "@angular/core"; importar {Rutas, RouterModule} desde "@angular/router"; importar { PostListComponent } desde "./components/post-list/post-list.component"; importar {DemoResolverService} desde "./resolvers/demo-resolver.service"; rutas constantes: Rutas = [ { ruta: "publicaciones", componente: PostListComponent, resolver: { publicaciones: DemoResolverService } }, { camino: "", redirigir a: "publicaciones", pathMatch: "completo" } ]; @NgModule({ importaciones: [RouterModule.forRoot(rutas)], exportaciones: [Módulo de enrutador] }) export class AppRoutingModule {}
Se ha agregado una resolve
a la configuración de enrutamiento, que iniciará una solicitud HTTP
y luego permitirá que el componente se inicialice cuando HTTP
regrese exitosamente. La ruta ensamblará los datos devueltos por HTTP
.
para mostrarle al usuario que hay una solicitud en progreso, escribimos un loader
público y simple en AppComponent
. Puede personalizarlo según sea necesario.
aplicación.component.html
<div class="loader" *ngIf="isLoader"> <div>Cargando...</div> </div> <router-outlet></router-outlet>
app.component.ts
import {Componente} desde "@angular/core"; importar { enrutador, evento de enrutador, Inicio de navegación, NavegaciónFin } de "@angular/router"; @Componente({ selector: "raíz de aplicación", URL de plantilla: "./app.component.html", URL de estilo: ["./app.component.scss"] }) exportar clase AppComponent { isLoader: booleano; constructor(privado _router: Enrutador) {} ngOnInit() { this.routerEvents(); } eventosenrutador() { this._router.events.subscribe((evento: RouterEvent) => { cambiar (verdadero) { caso de evento instancia de NavigationStart: { this.isLoader = verdadero; romper; } evento de caso instancia de NavigationEnd: { this.isLoader = falso; romper; } } }); } }
Cuando comienza la navegación, isLoader
se le asigna true
y verá el siguiente efecto en la página.
Cuando resolver
termine de procesarse, quedará oculto.
Ahora es el momento de obtener el valor de la ruta y mostrarlo.
port-list.component.ts
importa {Componente, OnInit} desde "@angular/core"; importar {Enrutador, ActivatedRoute} desde "@angular/router"; importar { Publicar } desde "src/app/models/post"; @Componente({ selector: "lista de publicaciones de aplicaciones", URL de plantilla: "./post-list.component.html", URL de estilo: ["./post-list.component.scss"] }) la clase de exportación PostListComponent implementa OnInit { publicaciones: Publicación []; constructor (ruta _privada: ruta activada) { this.publicaciones = []; } ngOnInit() { this.posts = this._route.snapshot.data["publicaciones"]; } }
Como se muestra arriba, el valor de post
proviene de los data
de información instantánea de ActivatedRoute
. Ambos valores se pueden obtener siempre que configures la misma información en la ruta.
Representamos de la siguiente manera en HTML
.
<div class="contenedor de cuadrícula de lista de publicaciones"> <div class="card" *ngFor="dejar publicar publicaciones"> <div class="title"><b>{{post?.title}}</b></div> <div class="body">{{post.body}}</div> </div> </div>
Los estilos de fragmentos CSS
hacen que se vea más hermoso.
lista de puertos.component.css
.grid-container { pantalla: cuadrícula; columnas-plantilla-cuadrícula: calc(100%/3) calc(100%/3) calc(100%/3); } .tarjeta { margen: 10px; sombra de cuadro: negro 0 0 2px 0px; relleno: 10px; }
Se recomienda utilizar el preprocesador scss para escribir estilos.
Después de obtener los datos de la ruta, se mostrarán en HTML
. El efecto es el siguiente: instantánea.
En este punto, ha aprendido a utilizar resolver
en su proyecto.
Combinado con el diseño de la experiencia del usuario y con la ayuda del resolver
, puede mejorar el rendimiento de su aplicación. Para obtener más información, puede visitar el sitio web oficial.
Este artículo es una traducción, utilizando traducción gratuita, con comprensión personal y comentarios agregados. La dirección original es:
https://www.pluralsight.com/guides/prefetching-data-for-an-angular-route
.