๐ฆ๐ฅ๐๐ถ๐ณ๐ณ๐ฒ๐ฟ๐ฒ๐ป๐ฐ๐ฒ ๐ฏ๐ฒ๐๐๐ฒ๐ฒ๐ป ๐๐ฒ๐ณ๐ฎ๐๐น๐ ๐๐ต๐ฎ๐ป๐ด๐ฒ ๐๐ฒ๐๐ฒ๐ฐ๐๐ถ๐ผ๐ป ๐ฎ๐ป๐ฑ ๐ข๐ป๐ฃ๐๐๐ต ๐ถ๐ป ๐ฎ ๐ญ๐ฌ๐ฌ% ๐๐ถ๐ด๐ป๐ฎ๐น๐-๐ฏ๐ฎ๐๐ฒ๐ฑ ๐ญ๐ผ๐ป๐ฒ๐น๐ฒ๐๐ ๐ฎ๐ฝ๐ฝ๐น๐ถ๐ฐ๐ฎ๐๐ถ๐ผ๐ป?
In practice, no meaningful difference. But still very interesting to know why:
๐๐ผ๐ ๐๐ถ๐ด๐ป๐ฎ๐น๐ ๐ฑ๐ฟ๐ถ๐๐ฒ ๐ฐ๐ต๐ฎ๐ป๐ด๐ฒ ๐ฑ๐ฒ๐๐ฒ๐ฐ๐๐ถ๐ผ๐ป
When a signal is read in a template, Angular's reactive graph records that dependency. When the signal updates, Angular internally calls markForCheck() on that component โ regardless of its change detection strategy.
Both Default and OnPush get marked dirty and re-rendered by the same mechanism.
๐ช๐ต๐ฎ๐ ๐ข๐ป๐ฃ๐๐๐ต ๐๐ฎ๐ ๐ฎ๐ฐ๐๐๐ฎ๐น๐น๐ ๐๐ผ๐น๐๐ถ๐ป๐ด
OnPush was designed to opt out of the Zone.js-driven "check everything" cycle.
Without it, Zone.js would patch every setTimeout, Promise, XHR, etc. and trigger a full top-down tree walk.
OnPush let you say "only check me if my inputs changed or Iwas explicitly marked dirty."
In a zoneless app, that problem doesn't exist. There is no global tick.
Either:
1 - A signal marks a component dirty
2 - Or you mark the component has dirty yourself explicitly
Notice that the async pipe will also mark the component as dirty, but here I'm assuming a signals-only app.
In a signal-based zoneless app, there's no runaway Zone.js cycle to protect against.
๐ช๐ต๐ฎ๐ ๐ต๐ฎ๐ฝ๐ฝ๐ฒ๐ป๐ ๐ถ๐ณ ๐๐ถ๐ด๐ป๐ฎ๐น๐ ๐ฎ๐ฟ๐ฒ ๐ฏ๐๐ฝ๐ฎ๐๐๐ฒ๐ฑ
In this exact type of application, if you accidentally bypass signals โ a direct property mutation, a class field updated without signal.set(), etc. โ nothing happens.
This hold true for both Default and OnPush - again this is true for a zoneless application specifically.
In a disciplined signals-only codebase that's actually a non-issue - every data modification goes via a signal.
๐๐ป๐ด๐๐น๐ฎ๐ฟ'๐ ๐ฑ๐ถ๐ฟ๐ฒ๐ฐ๐๐ถ๐ผ๐ป
In the long term, it looks like fine-grained signal reactivity replaces the more coarse-grained Default/OnPush distinction entirely.
The more concrete near-term step is
github.com/angular/angular/dโฆ,
which proposes making OnPush the schematic default in Angular 22 โ because in a signals-first world, Default becomes the odd choice rather than OnPush.
#angular #angular21 #angular22 #onpush #changedetection