Orientation — 2022 → 2026
What stayed the same, what changed, and the order to read this site in.
This page is the map. Read the five-point summary below, then jump to whichever topic you need. Every page that follows assumes only one thing: that you wrote Angular before, and that the framework you came back to is not the one you left.
What stayed the same
Almost all of it. Angular is still components with templates, dependency injection, services, routing and forms. ngOnInit still runs after the first render, [property] still binds one way and (event) the other, and *ngIf still works if you want it to. The mental model transfers.
What changed is how you write all of it. The framework stopped asking you to tell it when something changed, and started working it out from what you read.
The five changes that matter
If you only remember five things about Angular after 2022, these are the ones that change the code you write every day.
- Signals are how state is held.
signal(),computed()andeffect()replace most of the manual bookkeeping that used to go withBehaviorSubjectand theasyncpipe. A template reads{{ count() }}and re-renders itself whencountchanges — noasyncpipe, nomarkForCheck(). Start with Signals. - Zoneless is the default. There is no
zone.jsin a new project, and no patched browser APIs. Angular tracks what changed through signals and the template, not by monkey-patchingsetTimeout. See Zoneless change detection. - Components are standalone. A normal app has no
NgModuleand nodeclarationsarray. A component imports exactly what its own template uses, which makes a component readable on its own. See Standalone components. - The template language has real control flow.
@if,@forand@switchare syntax now, not structural directives shipped inCommonModule.@forrequires atrackexpression, and@defercan lazy-load a part of a page you may never scroll to. See Templates & control flow. - Data loading is a signal too.
resource()andhttpResource()put loading, error and success states into one object you can read in a template, instead of a hand-rolledloadingboolean and three subscriptions. See HTTP & async data.
The timeline, in one pass
You left somewhere around Angular 9–13. Here is what moved while you were gone, newest first:
- v22 (current).
@Service()for root-provided services,injectAsync()for lazy dependency loading,OnPushas the default change-detection strategy for new components, Signal Forms,resourceand the ARIA APIs stable, WebMCP experimental. Template syntax gained spread and rest, inline arrow functions, multi-value@case, and exhaustive@switchchecking vianever. - v21. Zoneless became the default for new projects.
provideCheckNoChangesConfig({ exhaustive: true })for strict dev-mode checking. - v20. Angular's own build pipeline (esbuild/Vite) is the only one;
HttpClientgotwithFetch()by default in new projects; SSR and hydration matured. - v19.
standalone: truebecame the default and the flag started disappearing;@letin templates; incremental hydration landed as a developer preview. - v18. Zoneless change detection as an experimental provider, and the first usable
@deferbehaviour. - v17. The new control flow (
@if/@for/@switch), deferrable views, and the newprovideRouter-style standalone APIs. - v16. Signals arrived as a developer preview — the seed of everything above.
- v15. Standalone components became stable, and the
ng generate @angular/core:standalonemigration became usable. - v14. Typed reactive forms and
inject()outside of constructors, which is what made the standalone style possible at all.
Two of those are worth pausing on. Signals (v16) are the reason zoneless (v18–21) could happen, because the framework finally had a source of truth it could trust. And inject() (v14) is why the framework could stop leaning on constructors and NgModule provider arrays.
v22 in detail: the new things
Everything below is stable in v22 unless it says otherwise.
@Service()marks a class as a root-provided service in one line, replacing the@Injectable({ providedIn: 'root' })incantation.autoProvideddefaults totrue. See Dependency injection.injectAsync()awaits a dependency that arrives as a promise — a lazily loaded module, a WASM payload, a config file — inside an injection context.OnPushby default. Components the CLI generates are change-detection-clean from the start. If you were hand-annotating every class in 2022, that job is done.- Signal Forms (
@angular/forms/signals):form(), field-level validators,[formField], and a submit state you can read as a signal. See Forms. resource()/httpResource()are stable and are the recommended way to load data.- Template syntax additions: spread/rest, inline arrow functions with inferred parameters, multiple values in a single
@case, and an exhaustive@switchthat fails the build when anevercase is unhandled. - WebMCP (experimental): exposes an app's capabilities to browser agents over a standard protocol. Worth knowing about; not something to build on yet.
How this site is put together
The order below is the order the pages are meant to be read in, but nothing depends on reading them in sequence except the two you should not skip.
- Foundations — Standalone components and The component contract: what a component is now, and how data gets in and out of it.
- Reactivity — Signals. Read this one before the rest; the other five changes all assume it.
- Templates — Templates & control flow: the new block syntax, and what happens to
*ngIfand friends. - DI & Routing — Dependency injection and Routing.
- Data — HTTP & async data and Forms.
- Modern runtime — Zoneless change detection, Performance, SSR & hydration, and finally Un-learn & upgrade plus the Old → new cheatsheet to keep next to you while you migrate.
If you are here to fix something today, read Un-learn & upgrade first — it is a list of the patterns that are now actively wrong, with the error message each one produces. Then come back to the front.
The one-paragraph version
Angular is still the framework you know: components, templates, DI, routing, forms. It has stopped guessing when to re-render, and started knowing — because state lives in signals, and the template is honest about what it reads. Everything else on this site is a consequence of that single move.