Skip to content

Enrutamiento

Índice

  1. Introducción al enrutamiento en Angular
  2. Configuración de rutas en Angular
  3. Navegación entre rutas
  4. Parámetros de ruta
  5. Rutas anidadas
  6. Rutas con guardias de navegación
  7. Redirecciones
  8. Carga diferida de módulos
  9. Resolución de datos previos a la navegación
  10. Ejemplos prácticos
  11. Conclusiones

1. Introducción al Enrutamiento en Angular

El enrutamiento es una funcionalidad esencial para aplicaciones de una sola página (SPA). Permite:

  • Navegar entre vistas o componentes sin recargar la página.
  • Mantener la experiencia de usuario fluida y rápida.
  • Gestionar URLs específicas para cada vista.

Angular utiliza el módulo RouterModule para proporcionar un sistema de enrutamiento robusto. Este módulo permite definir rutas, asociarlas con componentes y gestionar la navegación de manera dinámica.


2. Configuración de Rutas en Angular

Definición de Rutas

Las rutas se configuran en un archivo dedicado, comúnmente app-routing.module.ts.

Ejemplo de configuración básica:

tsx
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { HomeComponent } from './home/home.component';
import { AboutComponent } from './about/about.component';
import { ContactComponent } from './contact/contact.component';

const routes: Routes = [
  { path: 'home', component: HomeComponent },
  { path: 'about', component: AboutComponent },
  { path: 'contact', component: ContactComponent },
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

Estructura de las Rutas

Cada ruta es un objeto con las siguientes propiedades principales:

  • path: Define la URL de la ruta.
  • component: Especifica el componente que se renderizará.
  • redirectTo: Redirige a otra ruta.
  • children: Define rutas anidadas.

3. Navegación entre Rutas

La directiva routerLink permite enlazar rutas en plantillas HTML.

Ejemplo:

html
<a routerLink="/home">Inicio</a>
<a routerLink="/about">Acerca de</a>
<a routerLink="/contact">Contacto</a>

<router-outlet>

Es un marcador en el DOM donde se renderiza el contenido del componente asociado a la ruta activa.

Uso básico:

html
<router-outlet></router-outlet>

4. Parámetros de Ruta

Los parámetros de ruta permiten enviar datos dinámicos a través de la URL.

Definición de Ruta:

tsx
{ path: 'product/:id', component: ProductDetailsComponent }

Acceso a Parámetros:

tsx
import { ActivatedRoute } from '@angular/router';

@Component({...})
export class ProductDetailsComponent {
  productId: string;

  constructor(private route: ActivatedRoute) {
    this.route.params.subscribe(params => {
      this.productId = params['id'];
    });
  }
}

5. Rutas Anidadas

Las rutas anidadas permiten definir estructuras jerárquicas.

Ejemplo:

tsx
const routes: Routes = [
  { path: 'products', component: ProductsComponent, children: [
    { path: 'list', component: ProductListComponent },
    { path: 'details/:id', component: ProductDetailsComponent }
  ]}
];

En el componente padre:

html
<router-outlet></router-outlet>

6. Rutas con Guardias de Navegación

Las guardias controlan el acceso a rutas específicas.

Creación de Guardia:

tsx
import { Injectable } from '@angular/core';
import { CanActivate, Router } from '@angular/router';

@Injectable({
  providedIn: 'root'
})
export class AuthGuard implements CanActivate {
  constructor(private router: Router) {}

  canActivate(): boolean {
    const isAuthenticated = /* lógica de autenticación */;
    if (!isAuthenticated) {
      this.router.navigate(['/login']);
    }
    return isAuthenticated;
  }
}

Uso en una Ruta:

tsx
{ path: 'admin', component: AdminComponent, canActivate: [AuthGuard] }

7. Redirecciones

Para redirigir automáticamente de una ruta a otra:

Ejemplo:

tsx
{ path: '', redirectTo: '/home', pathMatch: 'full' }
  • pathMatch:
    • full: La URL debe coincidir completamente.
    • prefix: Coincide parcialmente.

8. Carga Diferida de Módulos

La carga diferida mejora el rendimiento al cargar módulos solo cuando son necesarios.

Definición:

tsx
{ path: 'admin', loadChildren: () => import('./admin/admin.module').then(m => m.AdminModule) }

Estructura del Módulo: El módulo debe tener rutas definidas dentro de él:

tsx
const routes: Routes = [
  { path: '', component: AdminDashboardComponent },
];
@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class AdminRoutingModule { }

9. Resolución de Datos Previos a la Navegación

Los resolvers cargan datos antes de activar una ruta.

Resolver:

tsx
import { Injectable } from '@angular/core';
import { Resolve } from '@angular/router';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class ProductResolver implements Resolve<any> {
  resolve(): Observable<any> {
    return /* lógica para cargar datos */;
  }
}

Uso en una Ruta:

tsx
{ path: 'product/:id', component: ProductDetailsComponent, resolve: { product: ProductResolver } }

Acceso a los Datos Resueltos:

tsx
constructor(private route: ActivatedRoute) {
  this.route.data.subscribe(data => {
    console.log(data['product']);
  });
}

10. Ejemplos Prácticos

  1. Barra de navegación dinámica:
    • Utiliza routerLink para enlazar a diferentes secciones.
  2. Rutas protegidas con autenticación:
    • Implementa AuthGuard para proteger rutas sensibles.
  3. Parámetros de búsqueda:
    • Usa queryParams para enviar datos adicionales en la URL.
  4. SPA compleja con rutas anidadas:
    • Define jerarquías de rutas para gestionar secciones relacionadas.
  5. Carga perezosa de módulos:
    • Mejora el rendimiento dividiendo la aplicación en módulos diferidos.

11. Conclusiones

El enrutamiento en Angular es una herramienta poderosa que permite crear aplicaciones SPA eficientes y escalables. Dominar sus características, como la carga diferida, las rutas anidadas y los resolvers, te permitirá gestionar mejor la navegación y el rendimiento de tu aplicación.