State Management Patterns in Modern Signal-Based Angular
How signals change the calculus around state management in Angular, and when a plain service with writable signals is enough versus reaching for a store.
Category
15 articles
How signals change the calculus around state management in Angular, and when a plain service with writable signals is enough versus reaching for a store.
Signals are not just a new API — they change how change detection works. Here is the model that makes signal, computed, and effect click.
Practical patterns for managing focus and applying ARIA attributes correctly when building custom interactive components in Angular.
Practical rules for crossing the boundary between RxJS observables and Angular signals without introducing timing bugs or memory leaks.
How Angular's router preloading strategies work under the hood, and how to combine them with lazy-loaded routes for faster perceived navigation.
How to build positioned, dismissible overlays such as menus and popovers using the Angular CDK's OverlayModule instead of ad-hoc absolute positioning.
A practical look at how resource() and httpResource replace ad-hoc RxJS pipelines for loading, error, and reload state around async data in Angular.
OnPush doesn't make a component faster on its own — it changes when Angular bothers to check it at all. Understanding the difference matters.
How Angular's SSR pipeline and incremental hydration reduce time-to-interactive by rehydrating the DOM in stages instead of all at once.
Most brittle Angular tests fail because they test implementation, not behavior. A look at TestBed patterns that stay green through real refactors.
Angular's reactive forms went from returning any everywhere to fully inferred types. Here's what that buys you and where it still leaks.
Class-based guards are gone from the recommended path. Here's how functional guards and resolvers actually change route protection and data loading.
The inject() function didn't just shorten constructors — it decoupled dependency lookup from class instantiation entirely, and that changes what's possible.
The @defer block turns lazy loading from a routing-level decision into a template-level one, with triggers that fit real UI patterns.
The new block syntax replaces *ngIf and *ngFor with something faster to compile, easier to read, and harder to misuse.