CodeForge

Angular 21 de Cero a Experto / Routing

Resolvers: los datos listos antes de entrar a la página

Teoría18 min20 XP

Cuando una página necesita datos de una API, tienes dos opciones: mostrarla vacía y cargar los datos DESPUÉS (con un "cargando…" parpadeante), o cargar los datos ANTES y mostrar la página ya lista. Un RESOLVER hace lo segundo: precarga los datos durante la navegación, de modo que el componente nace con todo en mano. Es una función —como los guards— y cierra tu caja de herramientas de routing. Hoy sabes cuándo y cómo usarlo.

El plato servido antes de sentarte

Un resolver funcional

Un resolver es una función ResolveFn<T> que devuelve los datos (o una Promise/Observable de ellos). Angular espera a que resuelva antes de activar la ruta:

gasto.resolver.ts
import { inject } from '@angular/core';
import { ResolveFn } from '@angular/router';
import { ApiGastosService } from './api-gastos.service';
import { Gasto } from './gasto.model';

export const gastoResolver: ResolveFn<Gasto> = (route) => {
const api = inject(ApiGastosService);
const id = Number(route.paramMap.get('id'));
return api.obtener(id);   // Angular espera esta promesa antes de entrar
};

Lo conectas a la ruta con resolve, dándole un nombre a los datos:

app.routes.ts
{
path: 'gasto/:id',
resolve: { gasto: gastoResolver },   // 'gasto' estará listo al entrar
component: DetalleGastoComponent,
}

Y en el componente recibes el dato resuelto —con el binding de inputs, como un input() del mismo nombre que la clave (gasto)—:

detalle-gasto.component.ts
@Component({
selector: 'app-detalle-gasto',
template: `<h2>{{ gasto().nombre }}</h2><p>{{ gasto().valor }} COP</p>`,
})
export class DetalleGastoComponent {
// el dato precargado por el resolver llega como input señal (sin "cargando")
gasto = input.required<Gasto>();
}

Como el resolver ya trajo el gasto, el template puede asumir que existe: nada de estados de carga ni @if de "cargando". La página nace completa.

Cuándo SÍ y cuándo NO usar un resolver

Antes vs Ahora

¿Cuál es el principal riesgo de usar un resolver para datos lentos?

Mini-reto

Decide, para cada caso, si usarías un resolver o carga dentro del componente con resource(), y por qué: 1) el detalle de un gasto (datos pequeños, la página no existe sin él); 2) un dashboard con cinco widgets que cargan de endpoints distintos; 3) la ficha de un usuario que tarda ~2s en cargar desde un servicio externo lento. Escribe el ResolveFn del caso 1.

Qué sigue

Cierras la teoría de routing: rutas, parámetros como señales, lazy loading, guards y resolvers. Tienes todo para convertir componentes sueltos en una aplicación navegable y robusta. El reto del módulo lo junta: vas a diseñar el mapa de rutas de "Mi Bolsillo" con un guard de autenticación y la lógica de navegación, probando en vivo el corazón de todo: emparejar una URL con su ruta.