Angular

Angular

Tutorial Angular: Parámetros en rutas con ActivatedRoute

Angular - Aprende a manejar parámetros en rutas con ActivatedRoute. Configura rutas dinámicas y accede a los parámetros usando params, paramMap, snapshot y la función inject().

Los parámetros en rutas son partes variables dentro de las URLs. Estas partes variables, o parámetros, permiten que una misma ruta pueda manejar diferentes datos dependiendo del valor del parámetro. Por ejemplo:

  • Una ruta de perfil de usuario: /usuario/:nombre
  • Una ruta de detalle de producto: /producto/:id
  • Una ruta de categoría y subcategoría: /categoria/:catId/subcategoria/:subId

En estos ejemplos, los segmentos precedidos por : son parámetros que pueden cambiar dinámicamente.

Configuración de rutas con parámetros

Para configurar rutas con parámetros en Angular, debes usar el módulo RouterModule del paquete @angular/router. Los parámetros de rutas permiten que las rutas sean dinámicas y flexibles, lo que facilita la administración de rutas basadas en valores específicos como identificadores o nombres.

En el archivo de configuración de rutas (app-routing.module.ts o el de tu elección), tu array de rutas debería incluir un objeto de ruta que contenga una propiedad path con los segmentos de ruta y los parámetros denotados por los dos puntos (:). 

Si estás trabajando en una aplicación más pequeña o un componente independiente (standalone) que no requiere un archivo de enrutamiento específico, puedes configurar las rutas directamente en el archivo principal de la aplicación (generalmente app.module.ts) o en el propio componente standalone. Independientemente de dónde definas tus rutas, la estructura básica será la misma.

Por ejemplo:

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { DetalleProductoComponent } from './detalle-producto/detalle-producto.component';

const routes: Routes = [
  { path: 'producto/:id', component: DetalleProductoComponent }
];

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

En este ejemplo, :id es un parámetro de ruta. La ruta producto/:id permitirá la navegación a DetalleProductoComponent con un parámetro dinámico id.

Puedes definir múltiples parámetros en una ruta. Por ejemplo:

const routes: Routes = [
  { path: 'producto/:categoria/:id', component: DetalleProductoComponent }
];

Aquí la ruta producto/:categoria/:id define dos parámetros de ruta: categoria e id.

Acceso a los parámetros utilizando ActivatedRoute

Para acceder a los parámetros de una ruta en Angular, se utiliza el servicio ActivatedRoute, que proporciona acceso a los datos de la ruta asociada con el componente que se está instanciando actualmente. Este servicio permite suscribirse a los cambios en la ruta y acceder a los parámetros de diversas maneras.

Existen varias maneras de acceder a los parámetros de una ruta en Angular, a través de ActivatedRoute. Cada método tiene sus propias características y casos de uso. Además, con las versiones más recientes de Angular, podemos utilizar la función inject() como una alternativa a la inyección de dependencias en el constructor.

params

El params de ActivatedRoute devuelve un observable que emite un objeto cada vez que los parámetros son emitidos por el router. Este método es útil para suscribirse a los cambios de parámetros y reaccionar ante ellos.

Para comenzar a usar ActivatedRoute, primero debes inyectarlo en el constructor del componente donde necesitas acceder a los parámetros de la ruta. 

Ejemplo usando el constructor:

import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';

@Component({
  selector: 'app-detalle-producto',
  templateUrl: './detalle-producto.component.html',
  styleUrls: ['./detalle-producto.component.css']
})
export class DetalleProductoComponent implements OnInit {
  id: string | null = null;

  constructor(private route: ActivatedRoute) { }

  ngOnInit() {
    this.route.params.subscribe(params => {
      this.id = params['id'];
      console.log(this.id);
    });
  }
}

En este ejemplo, ActivatedRoute es inyectado en el constructor y luego utilizado en el hook ngOnInit para suscribirse a los cambios en los parámetros de la ruta. La propiedad params de ActivatedRoute es un observable que contiene los parámetros de la URL.

Ejemplo usando inject():

import { Component, OnInit, inject } from '@angular/core';
import { ActivatedRoute } from '@angular/router';

@Component({
  selector: 'app-detalle-producto',
  templateUrl: './detalle-producto.component.html',
  styleUrls: ['./detalle-producto.component.css']
})
export class DetalleProductoComponent implements OnInit {
  private route = inject(ActivatedRoute);
  id: string | null = null;

  ngOnInit() {
    this.route.params.subscribe(params => {
      this.id = params['id'];
      console.log(this.id);
    });
  }
}

paramMap

Otra manera de acceder a los parámetros es utilizando paramMap, que proporciona métodos de acceso más seguros para los parámetros y soporta mejor los escenarios donde los parámetros son opcionales.

Ejemplo usando el constructor:

export class DetalleProductoComponent implements OnInit {
  id!: string;

  constructor(private route: ActivatedRoute) { }

  ngOnInit() {
    this.route.paramMap.subscribe(paramMap => {
      this.id = paramMap.get('id')!;
      console.log(this.id);
    });
  }
}

En este ejemplo, paramMap es un observable que se suscribe en ngOnInit para obtener el objeto paramMap, y el método get se utiliza para recuperar el valor del parámetro id.

Ejemplo usando inject():

export class DetalleProductoComponent implements OnInit {
  private route = inject(ActivatedRoute);
  id: string | null = null;

  ngOnInit() {
    this.route.paramMap.subscribe(paramMap => {
      this.id = paramMap.get('id');
      console.log(this.id);
    });
  }
}

snapshot

El snapshot de ActivatedRoute permite acceder de manera estática a los parámetros de la ruta en el momento en que se carga el componente. Este método es útil cuando sabes que los parámetros no cambiarán durante la vida del componente y quieres evitar los costes relacionados con las suscripciones a observables.

Ejemplo usando el constructor:

export class DetalleProductoComponent implements OnInit {
  id: string;

  constructor(private route: ActivatedRoute) { }

  ngOnInit() {
    this.id = this.route.snapshot.params['id'];
    console.log(this.id);
  }
}

El snapshot permite acceder a los parámetros directamente y es útil cuando se sabe de antemano que los parámetros no cambiarán durante la vida del componente.

Ejemplo usando inject():

export class DetalleProductoComponent implements OnInit {
  private route = inject(ActivatedRoute);
  id: string | null = null;

  ngOnInit() {
    this.id = this.route.snapshot.paramMap.get('id');
    console.log(this.id);
  }
}

Cada método tiene ventajas dependiendo del caso de uso. params y paramMap son adecuados para manejar cambios dinámicos en los parámetros, mientras que snapshot se adapta bien a situaciones estáticas donde los parámetros no varían.

ActivatedRoute con inject()

La función inject() es una característica más reciente de Angular que proporciona una forma alternativa y más flexible de inyectar dependencias, incluyendo ActivatedRoute. Esta característica es parte del enfoque de Angular hacia una programación más funcional y menos dependiente de clases.

Ventajas de usar inject():

  1. Flexibilidad: Permite inyectar dependencias fuera del constructor, lo que puede ser útil en ciertos patrones de diseño.
  2. Legibilidad: En componentes con muchas dependencias, puede hacer que el código sea más limpio al evitar constructores largos.
  3. Uso en funciones: Permite la inyección de dependencias en funciones utilitarias o hooks personalizados.
  4. Compatibilidad con componentes independientes (standalone): Facilita la configuración de componentes independientes sin necesidad de módulos.

Ejemplos de uso

Componentes standalone

import { Component, inject } from '@angular/core';
import { ActivatedRoute } from '@angular/router';

@Component({
  selector: 'app-detalle-producto',
  standalone: true,
  template: '<h1>ID del producto: {{productId}}</h1>'
})
export class DetalleProductoComponent {
  private route = inject(ActivatedRoute);
  productId = this.route.snapshot.paramMap.get('id');
}

Hooks personalizados

import { inject } from '@angular/core';
import { ActivatedRoute } from '@angular/router';

export function useProductId() {
  const route = inject(ActivatedRoute);
  return route.paramMap.pipe(
    map(params => params.get('id'))
  );
}

// Uso en un componente
@Component({...})
export class ProductoComponent {
  productId$ = useProductId();
}
Certifícate en Angular con CertiDevs PLUS

Ejercicios de esta lección Parámetros en rutas con ActivatedRoute

Evalúa tus conocimientos de esta lección Parámetros en rutas con ActivatedRoute con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Signals en Angular

Angular
Puzzle

Guards funcionales

Angular
Test

Decodificar JWT en Angular

Angular
Test

Servicio con HttpClient

Angular
Código

Ciclo de vida de componentes en Angular

Angular
Test

Gestión de productos de Fake Store API

Angular
Proyecto

Data binding en Angular

Angular
Test

Routes sin módulos en Angular

Angular
Código

Router en Angular

Angular
Test

Instalación de Angular

Angular
Puzzle

Route Guards basados en interfaces

Angular
Código

La directiva @if en Angular

Angular
Puzzle

Formularios reactivos en Angular

Angular
Código

Servicios en Angular

Angular
Puzzle

Interceptor funcional

Angular
Test

Servicio con Array

Angular
Código

La directiva @for en Angular

Angular
Puzzle

Interceptores HTTP

Angular
Código

Componentes standalone true

Angular
Puzzle

Formularios con ngModel en Angular

Angular
Puzzle

Routes en Angular

Angular
Test

Comunicación entre componentes Angular

Angular
Test

Parámetros en rutas con ActivatedRoute

Angular
Test

CRUD de Restaurantes y Platos

Angular
Proyecto

Tablas en Angular Material

Angular
Puzzle

Formulario de registro de usuarios

Angular
Proyecto

Instalación y uso de NgBoostrap

Angular
Puzzle

Desarrollo de componentes Angular

Angular
Test

JWT en Angular

Angular
Código

Formularios reactivos en Angular

Angular
Puzzle

Formularios en Angular Material

Angular
Puzzle

Layout con Angular Material

Angular
Puzzle

Effects en Angular

Angular
Test

Data binding

Angular
Código

HttpClient en servicios de Angular

Angular
Puzzle

Desarrollo de módulos Angular

Angular
Puzzle

Comandos Angular CLI

Angular
Puzzle

Subir archivo en formularios

Angular
Test

La directiva routerLink en Angular

Angular
Test

Todas las lecciones de Angular

Accede a todas las lecciones de Angular y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Instalación Angular

Angular

Introducción Y Entorno

Comandos Angular Cli

Angular

Introducción Y Entorno

Desarrollo De Componentes Angular

Angular

Componentes

Data Binding En Angular

Angular

Componentes

Ciclo De Vida De Componentes En Angular

Angular

Componentes

Comunicación Entre Componentes Angular

Angular

Componentes

La Directiva @If En Angular

Angular

Componentes

La Directiva @For En Angular

Angular

Componentes

Componentes Standalone

Angular

Componentes

Desarrollo De Módulos Angular

Angular

Módulos

Routes En Angular

Angular

Enrutado Y Navegación

Router En Angular

Angular

Enrutado Y Navegación

La Directiva Routerlink En Angular

Angular

Enrutado Y Navegación

Parámetros En Rutas Con Activatedroute

Angular

Enrutado Y Navegación

Routes Sin Módulos En Angular

Angular

Enrutado Y Navegación

Servicios En Angular

Angular

Servicios E Inyección De Dependencias

Httpclient En Servicios De Angular

Angular

Servicios E Inyección De Dependencias

Formularios Con Ngmodel En Angular

Angular

Formularios

Formularios Reactivos En Angular

Angular

Formularios

Subir Archivo En Formularios

Angular

Formularios

Layout Con Angular Material

Angular

Integración Con Angular Material

Tablas En Angular Material

Angular

Integración Con Angular Material

Formularios En Angular Material

Angular

Integración Con Angular Material

Instalación Y Uso De Ngboostrap

Angular

Integración Con Bootstrap Css

Signals En Angular

Angular

Signals Y Reactividad

Effects En Angular

Angular

Signals Y Reactividad

Route Guards Basados En Interfaces

Angular

Autenticación Y Autorización

Guards Funcionales

Angular

Autenticación Y Autorización

Interceptores Http Basados En Interfaz

Angular

Autenticación Y Autorización

Interceptores Http Funcionales

Angular

Autenticación Y Autorización

Seguridad Jwt En Angular

Angular

Autenticación Y Autorización

Decodificar Tokens Jwt En Angular

Angular

Autenticación Y Autorización

Certificados de superación de Angular

Supera todos los ejercicios de programación del curso de Angular y obtén certificados de superación para mejorar tu currículum y tu empleabilidad.

En esta lección

Objetivos de aprendizaje de esta lección

  1. Configurar rutas con parámetros en Angular usando RouterModule.
  2. Acceder a los parámetros de las rutas usando ActivatedRoute.
  3. Diferenciar entre los métodos params, paramMap y snapshot.
  4. Utilizar la función inject() para acceder a las dependencias de ActivatedRoute.
  5. Implementar rutas dinámicas y flexibles en una aplicación Angular.