Goodbye RxJS? A Deep Dive into Angular Signals
25/06/2025 / 3 minutes to read / Tags: Tutorial, Angular
What Are Angular Signals?
Angular Signals are a new reactive primitive introduced to simplify how we manage reactive state.
Example:
import { signal } from '@angular/core';
const counter = signal(0);
// Read signalconsole.log(counter()); // 0
// Update signalcounter.set(1);Signals are:
- Synchronous
- Fine-grained
- Dependency-tracked
- Built into the Angular change detection system (no async pipe needed)
Signals vs RxJS: The Key Differences
| Feature | Signals | RxJS |
|---|---|---|
| Reactivity Model | Pull-based | Push-based |
| Change Detection Integration | Native | Needs async pipe or manual trigger |
| Asynchronous streams | No | Yes |
| Composition tools | computed, effect | map, merge, switchMap, etc.. |
| Dependency tracking | Automatic | Manual via subscriptions |
| Learning curve | Easier for state | Steeper for streams |
Real-World Example: Counter with RxJS vs Signals
RxJS Version
import { BehaviorSubject } from 'rxjs';
export class CounterRxComponent { private count$ = new BehaviorSubject(0);
increment() { this.count$.next(this.count$.value + 1); }}Signals Version
import { signal } from '@angular/core';
export class CounterSignalComponent { count = signal(0);
increment() { this.count.set(this.count() + 1); }}Same feature, less boilerplate, easier tracking.
When to use Signals vs RxJS
Use signals when
- You’re managing UI state
- You want tight integration with Angular’s change detection
- You need simplicity and performance
Use RxJS when
- You deal with streams (HTTP, websockets)
- You need advanced operators
- You’re already in a RxJS-heavy codebase
Conclusion
RxJS isn’t going anywhere — but Signals are here to change how we think about reactivity in Angular.
If you can find an example project with both RxJS and signals on my github.
Happy Coding!
← Back to blog