Si no les sale el el valor en su html… prueben pondiendo el codigo en el metodo getProductsByPage
Http Basic
Conexión a REST APIs con Angular HTTP y buenas prácticas
Solicitudes GET en APIs con Angular: Obtener Productos
Consulta de Producto Específico en eCommerce con Angular
Integración de Swiper en Angular para Galería de Productos
Creación de Productos con POST y Data Transfer Objects en Angular
Actualización de Datos con Métodos PUT y PATCH en APIs
Eliminar productos con solicitudes DELETE en Angular
Paginación de Productos con Parámetros URL en Angular
Ventajas de los Observables sobre Promesas en Angular
Implementación de Retry con Observadores en Angular
Buenas prácticas
Solución de Problemas CORS en Aplicaciones Angular
Gestión de Ambientes en Angular: Desarrollo vs Producción
Manejo de Errores en Observables con Angular
Transformaciones de Datos en el Frontend con Map y Pipes
Evitando el Callback Hell con SwitchMap y ZIP en Observables
Auth
Autenticación con JWT: Implementación y Gestión de Sesiones en APIs
Autenticación y Manejo de Tokens en Peticiones HTTP
Implementación de Interceptores en Angular para Medir Tiempos de Respuesta
Interceptores en Angular: Agregar Token Automáticamente
Uso de Contextos para Interceptores en Angular
Archivos
Descarga de Archivos con HTTP Client en Angular
Subida de Archivos con HTTP y Angular paso a paso
Despedida
Consumo de APIs en Angular con HTTP y Autenticación
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
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.
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.
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;
}
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%
})))
);
}
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.
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.
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.
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:
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
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
}
}))
)
}
Luego en la vista del componente se podría renderizar esta propiedad:
<p>Valor IVA: {{ product?.taxes | currency }}</p>
Creo que vi esta misma notacion cuando comence a trabajar y al fin puedo decir que la entiendo bien
el signo .? se llama Optional chaining (?.). pueden ver el curso de :
https://platzi.com/clases/1815-ecmascript-6/39727-ecmascript-2020-caracteristicas-importantes/
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Optional_chaining
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';
});
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?