Interoperabilidad de RXJS y Signals en Angular
Clase 15 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 Signals con RXJS en Angular representa una evolución significativa en el manejo de la reactividad. Esta nueva funcionalidad permite aprovechar el código existente basado en observables mientras se adopta el moderno patrón de Signals, ofreciendo una transición suave y eficiente para los desarrolladores de Angular.
¿Cómo integrar RXJS y Signals con toSignal?
Angular reconoce que muchos desarrolladores tienen una gran cantidad de código basado en RXJS, el patrón de observabilidad que ha sido fundamental en versiones anteriores. Con la introducción de Signals, surge la necesidad de una interoperabilidad entre ambos enfoques. La función toSignal() es la respuesta a esta necesidad, permitiendo convertir observables en signals sin tener que reescribir todo el código existente.
La clave para utilizar correctamente esta función es entender qué tipo de observable estamos manejando:
- Observables con valor inicial: Como los
BehaviorSubject, que ya contienen un valor desde su creación - Observables sin valor inicial: Como los
Subjectsimples, que emiten valores solo después de una acción específica
Convirtiendo observables con valor inicial
Cuando trabajamos con observables que ya tienen un valor inicial, la conversión es bastante directa:
import { toSignal } from '@angular/core/rxjs-interop';
import { BehaviorSubject } from 'rxjs';
// Observable con valor inicial
const observableWithInit = new BehaviorSubject<string>('init value');
// Conversión a Signal (modo síncrono)
const signalWithInit = toSignal(observableWithInit);
En este caso, el signal creado se sincronizará automáticamente con el valor inicial del observable. No es necesario proporcionar un valor inicial adicional ya que el observable ya lo tiene.
Convirtiendo observables sin valor inicial
Para observables que no tienen un valor inicial, debemos proporcionar uno explícitamente:
import { toSignal } from '@angular/core/rxjs-interop';
import { Subject, delay } from 'rxjs';
// Observable sin valor inicial
const observableWithoutInit = new Subject<string>();
// Conversión a Signal con valor inicial explícito
const signalWithoutInit = toSignal(observableWithoutInit.pipe(
delay(3000) // Simulando una demora en la emisión
), { initialValue: '---' });
En este escenario, el parámetro initialValue es crucial porque los signals siempre necesitan un valor inicial, a diferencia de algunos observables.
¿Cuándo y por qué utilizar toSignal en proyectos Angular?
La función toSignal() resulta especialmente útil en situaciones donde:
- Tienes servicios existentes basados en RXJS: Particularmente servicios HTTP que devuelven observables
- Quieres adoptar Signals gradualmente: Sin necesidad de reescribir toda la lógica de tu aplicación
- Necesitas interoperabilidad entre paradigmas: Permitiendo que partes de tu aplicación usen observables mientras otras usan signals
La ventaja principal es que puedes mantener toda tu lógica de negocio en observables mientras aprovechas las características de los signals en tus componentes, como la integración con computed() o el uso en plantillas sin necesidad de pipes async.
Ejemplo práctico de interoperabilidad
Veamos cómo podemos emitir valores a nuestros observables y ver la sincronización automática con los signals:
// Métodos para emitir valores
emitWithInit() {
this.observableWithInit.next('new value');
}
emitWithoutInit() {
this.observableWithoutInit.next('***');
}
En la plantilla HTML, podemos usar directamente los signals sin preocuparnos por la suscripción o el ciclo de vida:
<div>
<p>Signal con valor inicial: {{ signalWithInit() }}</p>
<button (click)="emitWithInit()">Emitir nuevo valor</button>
</div>
<div>
<p>Signal sin valor inicial: {{ signalWithoutInit() }}</p>
<button (click)="emitWithoutInit()">Emitir nuevo valor</button>
</div>
Cuando hacemos clic en los botones, los valores emitidos por los observables se reflejan automáticamente en los signals, demostrando la sincronización perfecta entre ambos paradigmas.
Aplicaciones prácticas en servicios HTTP
Una de las aplicaciones más comunes de toSignal() será con los servicios HTTP, que por naturaleza devuelven observables:
// En un servicio
getProducts(): Observable<Product[]> {
return this.http.get<Product[]>('/api/products');
}
// En un componente
products = toSignal(this.productService.getProducts(), { initialValue: [] });
Este enfoque permite seguir utilizando el HttpClient de Angular tal como está, mientras aprovechamos la simplicidad de los signals en nuestros componentes.
La función toSignal() representa un puente perfecto entre el pasado y el futuro de la reactividad en Angular, permitiendo una adopción gradual y pragmática de los nuevos patrones sin sacrificar el código existente. ¿Has comenzado a integrar Signals en tus proyectos con código RXJS existente? Comparte tu experiencia y las estrategias que has utilizado para esta transición.