No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Transformaciones de Datos en el Frontend con Map y Pipes

14/23
Recursos

¿Cómo transformar peticiones en Angular?

Al trabajar con aplicaciones web, a menudo ocurre que los datos que recibimos desde el backend no son del todo adecuados para el frontend. Pueden faltar campos necesarios para mostrar información o realizar cálculos adicionales. En estos casos, es esencial entender cómo transformar peticiones en Angular para enriquecer los datos adicionando o calculando atributos nuevos antes de presentarlos al usuario.

¿Cómo se añade un atributo desde el frontend?

Para añadir atributos calculados en el frontend, el método getAllProducts será nuestra base de trabajo. Imaginemos que deseamos añadir un campo adicional llamado taxes a cada producto, que no está incluido en la respuesta del backend pero es crucial para nuestros usuarios.

  1. Declarar el nuevo atributo: Primero, indicaremos que cada product tendrá un campo adicional llamado number, el cual será opcional. Esto se realiza en la definición del producto.

    export interface Product {
      id: string;
      name: string;
      price: number;
      // Nuevo campo opcional
      number?: number;
    }
    
  2. Calcular el nuevo atributo en el servicio: Luego, usaremos el operador map del servicio para calcular este nuevo atributo.

    getAllProducts() {
      return this.http.get<Product[]>(this.apiURL)
        .pipe(
          map(products => products.map(product => ({
            ...product,
            taxes: product.price * 0.19 // Suponiendo un IVA del 19%
          })))
        );
    }
    

¿Cuál es el papel del operador map en la transformación?

El operador map en Angular es fundamental para transformar datos observables. Al recibir un array de productos, podemos aplicarle nuevas transformaciones, convirtiendo cada respuesta en algo más acorde a nuestras necesidades.

  • Transformaciones observables: Esto implica analizar la respuesta del backend y modificarla antes de su consumo.
  • Transformaciones de elementos: Una segunda transformación utiliza el map nativo de JavaScript para aplicar cambios específicos en cada elemento del array.

Esta fluidez y adaptabilidad pueden ser vitales cuando los requisitos de negocio cambian o el diseño de la UI requiere información específica.

¿Cómo mejorar la presentación de datos con pipes?

Cuando calculamos valores como el de impuestos, es común enfrentarse a la presentación de números con varios decimales. Angular provee pipes que son herramientas útiles para transformar la salida de manera visualmente atractiva.

  • Uso del pipe de moneda: Podemos usar el pipe especial para manejar la presentación de monedas, asegurando que el valor se muestre adecuadamente en la interfaz, con el formato regional correcto.

    <span>{{ product.taxes | currency:'USD':true }}</span>
    

Este formato no solo mejora la legibilidad de la información, sino que también aumenta la usabilidad de la aplicación al adaptar los datos a las expectativas de los usuarios.

¿Cuáles son las mejores prácticas de transformación?

Es importante recordar que la lógica de negocio debe residir en los servicios, para que el componente se dedique simplemente a su responsabilidad principal: renderizar y gestionar la interacción con el usuario. Esto facilita la reutilización de código y mantiene el componente limpio y manejable. Además:

  • Aislar la lógica en el servicio: Esto permite que la transformación o cualquier operación sobre los objetos de datos sea más mantenible.
  • Reutilizar lógica de transformación: Facilita la integración con otros componentes que puedan requerir datos de manera similar.

En fin, el uso inteligente de estas transformaciones en Angular puede optimizar el proceso de desarrollo, asegurando al mismo tiempo que la aplicación se mantenga flexible y preparada para escalar o adaptar requisitos futuros. ¡Sigue aprendiendo y viendo cómo estos conceptos pueden aplicarse en otros contextos!

Aportes 9

Preguntas 5

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Si no les sale el el valor en su html… prueben pondiendo el codigo en el metodo getProductsByPage

Hay un error en esta clase en la parte de product?.taxes
lo que hace el ? en product? es validar si el objeto product existe, entonces usa la propiedad .taxes, por tanto product?.taxes no va a generar ningun error.

Lo ideal seria usar el ?? de la siguiente forma: product.taxes ?? '' es decir, si la propiedad es null o undefined coloca un string vacio.

en que momeno se puede usar el ??

Siguiendo este curso una opcion podria ser las imagenes. Si product.images viene null o undefined ahi si aplica y querdaria asi: product.images?.length

recordar que en el componente products, en oninit cargamos los productos por medio del servicio getProductsByPage, por ende es en este servicio es donde debemos usar el map dentro del pipe para que este agregue el elemento taxes que en los productos queremos visualizar. ( el pipe en getAllProducts ya no se usa a este punto).

RxJS map() operator is a transformation operator used to transform the items emitted by an Observable by applying a function to each item.
Documentación

A veces puede ser necesario hacer transformaciones a la respuesta de una petición, para poner ejemplo agregar datos para complementar la información que entrega el backend.

RXJS .map() → Es un operador que permite tomar cada uno de los valores que lleguen en el observable y aplicarles una transformación.

// Obtener los productos desde la API
  getProducts(limit?: number, offset?: number) {
    ...
    return this.http.get<Product[]>(this.apiUrl, { params })
    .pipe(
      map(products => products.map(item => {
        return {
          ...item,
          taxes: .19 * item.price
        }
      }))
    )
  }
  • products → Agrupa la respuesta del observable, esta es un array. Luego se usa un map nativo para agregar el atributo taxes a cada objeto dentro de products.

Luego en la vista del componente se podría renderizar esta propiedad:

<p>Valor IVA: {{ product?.taxes | currency }}</p>
  • El operador de optional chaining (?) permite que la propiedad solo se muestra si su valor no es nulo.

Creo que vi esta misma notacion cuando comence a trabajar y al fin puedo decir que la entiendo bien

El operador RxJS map() es un operador de transformación que se utiliza para transformar los elementos emitidos por un Observable aplicando una función a cada elemento.

    Swal.fire({
      title: 'Lo siento',
      text: 'El producto ' + errorMsg,
      icon: 'error',
      confirmButtonText: 'OK'
    });
    console.log(errorMsg);
    this.statusDetail = 'error';
  });