Conversión de Observables a Signals en Angular con toSignal
Clase 16 de 36 • Curso de Angular Avanzado
Contenido del curso
- 7

Buenas prácticas con variables locales en Angular
09:14 - 8

Optimización de Imágenes en Angular con NG Optimizate Image
17:08 - 9

Optimización de Rutas Amigables para SEO en Angular
11:27 - 10

"Reactividad en Angular: Migración a Input Signals"
20:42 - 11

Migración de Inputs a Signals en Angular: Mejora de Rendimiento y Flujo
12:24 - 12

Migración de Outputs en Angular: De Decoradores a Funciones
07:35 - 13

Primitivas reactivas de Angular: Uso de Linked Signal y Computed
12:56 - 14

Sincronización de Componentes en Angular con Model y Signals
12:03 - 15

Interoperabilidad de RXJS y Signals en Angular
11:18 - 16

Conversión de Observables a Signals en Angular con toSignal
08:07 - 17

Interoperabilidad de RXDS y Signals en Angular: Uso de RX Resourcers
11:10 - 18

Manejo de Parámetros Reactivos con RX Resource en Angular
09:18 - 19

Manejo de Promesas y Fetch en Angular sin RXJS
07:59 - 20

Reactividad en Angular: Uso de Signals para Consultas DOM
09:00 - 21

Configuración de Prettier para HTML en Angular
05:28 quiz de Nuevas Funcionalidades en Angular
- 22

Server Side Rendering en Angular: Builders y Migración
10:17 - 23

Server Side Rendering con Angular: Mejora Rendimiento y SEO
13:26 - 24

Manejo de APIs del Navegador con Angular: Uso de AfterNextRender
09:43 - 25

Geolocalización y APIs: Creando un Mapa de Tiendas Cercanas
15:39 - 26

Habilitar Pre-rendering en Angular para Generación de Sitios Estáticos
11:26 - 27

Despliegue de Aplicaciones Node.js con App Fiber Hosting
18:12 quiz de Server-Side Rendering (SSR) y Navegación
- 28

Generación de Meta Tags Dinámicos con Angular y Open Graph
15:11 - 29

Creación de MetaTags Dinámicos en Angular
12:51 - 30

Proceso de Hydration y Event Replay en Angular
05:54 - 31

Implementación de Productos Relacionados en Angular eCommerce
09:26 - 32

Carga diferida de componentes en Angular para mejorar rendimiento
10:10 - 33

Optimización de Incremental Hydration en Angular
06:14 - 34

Configuración de Server Routing en Angular
10:43 - 35

Aplicaciones Sin Zone.js: Migración a Signals en Angular
13:02 - 36

Despliegue y Reactividad Avanzada en Angular
00:53
La integración de RxJS con Angular Signals representa un avance significativo en el manejo de datos reactivos en aplicaciones Angular. Esta combinación permite aprovechar lo mejor de ambos mundos: la potencia de los observables de RxJS y la simplicidad y rendimiento de las signals. Veamos cómo implementar esta integración de manera efectiva en proyectos reales.
¿Cómo convertir observables a signals con toSignal?
La función toSignal nos permite transformar observables de RxJS en signals de Angular, simplificando enormemente nuestro código. Esta función es especialmente útil cuando trabajamos con servicios que utilizan HttpClient, ya que estos generalmente devuelven observables.
Para implementar esta conversión, necesitamos seguir estos pasos:
- Importar la función
toSignaldesde@angular/core. - Aplicar esta función al observable que queremos convertir.
- Proporcionar un valor inicial si el observable no tiene uno.
Veamos un ejemplo práctico:
// Antes
export class ListProductComponent implements OnInit {
private productService = inject(ProductService);
categories = signal<Category[]>([]);
ngOnInit() {
this.productService.getAll().subscribe(categories => {
this.categories.set(categories);
});
}
}
// Después
export class ListProductComponent {
private productService = inject(ProductService);
categories = toSignal(this.productService.getAll(), { initialValue: [] });
}
Como podemos observar, el código se reduce significativamente. Ya no necesitamos:
- Implementar la interfaz
OnInit - Definir el método
ngOnInit() - Manejar manualmente la suscripción
- Llamar al método
set()del signal
Todo esto lo hace automáticamente toSignal, lo que resulta en un código más limpio y declarativo.
¿Cuándo usar el valor inicial en toSignal?
Es importante proporcionar un valor inicial cuando trabajamos con observables que no emiten inmediatamente, como es el caso de las peticiones HTTP. En nuestro ejemplo, utilizamos un array vacío como valor inicial:
categories = toSignal(this.productService.getAll(), { initialValue: [] });
Este valor se utilizará mientras se resuelve la petición HTTP, evitando errores de renderizado cuando intentamos acceder a propiedades de un valor que aún no existe.
Limitaciones al usar toSignal
Aunque toSignal simplifica enormemente nuestro código, presenta algunas limitaciones importantes que debemos considerar:
No se puede modificar manualmente el valor
Una restricción significativa es que no podemos usar el método set() en un signal creado con toSignal. Por ejemplo:
// Esto NO funcionará
categories = toSignal(this.productService.getAll(), { initialValue: [] });
categories.set([]); // Error: Property 'set' does not exist
Esto puede ser problemático si necesitamos reiniciar o modificar manualmente el valor del signal en algún momento.
Falta de estados derivados
Otra limitación es que toSignal no proporciona estados derivados como "loading" o "error". Si necesitamos estos estados, tendríamos que crear signals adicionales:
loadingProducts = signal(false);
ngOnInit() {
this.loadingProducts.set(true);
this.productService.getAll().subscribe({
next: (products) => {
this.products.set(products);
this.loadingProducts.set(false);
},
error: () => this.loadingProducts.set(false)
});
}
Esto puede llevar a un código más verboso y difícil de mantener, especialmente cuando tenemos múltiples peticiones HTTP.
Buenas prácticas al trabajar con toSignal
Para aprovechar al máximo esta función, considera las siguientes recomendaciones:
- Mantén el orden correcto de las inyecciones: Coloca siempre las inyecciones de dependencias al principio de la clase, antes de declarar los signals.
export class ListProductComponent {
private productService = inject(ProductService); // Primero las inyecciones
categories = toSignal(this.productService.getAll(), { initialValue: [] }); // Luego los signals
}
-
Proporciona siempre un valor inicial adecuado: Elige un valor inicial que sea compatible con la estructura de datos esperada para evitar errores en el template.
-
Considera las limitaciones: Si necesitas modificar manualmente el valor o manejar estados como loading o error, evalúa si
toSignales la mejor opción o si deberías usar un enfoque más tradicional.
La función toSignal representa un puente elegante entre el mundo de RxJS y las nuevas signals de Angular, permitiéndonos aprovechar la infraestructura existente basada en observables mientras adoptamos el nuevo paradigma de signals. Sin embargo, es importante entender sus limitaciones para decidir cuándo utilizarla.
En la próxima clase, exploraremos soluciones a estas limitaciones para crear una experiencia más completa al trabajar con datos asincrónicos en Angular.
¿Has experimentado con la conversión de observables a signals en tus proyectos? Comparte tus experiencias en los comentarios.