Signal effects are set to operate independently of Angular’s Change Detection mechanism. During the recent Angular Team Q&A, frequently asked questions about the newest RFCs were addressed.

Decouple effect() from Change Detection

Templates and signals have a strong bond, which limits how broadly you can apply them in your code.

Take signal and computed as an example. Until you either place them in a template or reference them inside an effect(), they stay inert.

When side-effects are what you need, effect() becomes essential—but it ties you down. Its execution is bound to the change detection cycle. That means any side-effect driven by a signal can't run outside that cycle. This limitation is about to disappear.

Alex Rickabaugh has opened a new pull request that stops the change detection from triggering the effect. The effect gets scheduled as an asynchronous operation instead—more specifically, as a microtask, comparable to a native Promise.

GitHub logo refactor(core): decouple effects from change detection #51049

Previously effects were queued as they became dirty, and this queue was flushed at various checkpoints during the change detection cycle. The result was that change detection was the effect runner, and without executing CD, effects would not execute. This leads a particular tradeoff:

  • effects are subject to unidirectional data flow (bad for dx)
  • effects don't cause a new round of CD (good/bad depending on use case)
  • effects can be used to implement control flow efficiently (desirable)

This commit changes the scheduling mechanism. Effects are now scheduled via the microtask queue. This changes the tradeoffs:

  • effects are no longer limited by unidirectional data flow (easy dx)
  • effects registered in the Angular zone will trigger CD after they run (same as Promise.resolve really)
  • the public effect() type of effect probably isn't a good building block for our built-in control flow, and we'll need a new internal abstraction.

As effect() is in developer preview, changing the execution timing is not considered breaking even though it may impact current users.

RFCs Q&A with the Angular Team

The "older" RFCs remain in the spotlight, still awaiting a resolution. One proposal seeks to embed control flow commands directly into templates, while another explores the idea of deferring component loading. A dedicated Q&A session was held, during which Angular team members walked through these proposals and fielded queries.

With the upcoming syntax, the familiar async pipe combined with *ngIf for handling Observables is set to become obsolete, replaced by a more polished approach.

Angular has also studied JSX, but it won't be adopting its model—the reason being that JSX is executable code, which clashes with Angular's philosophy. Still, select concepts from JSX could find their way into future Angular versions.

Alex Rickabaugh, the Angular core lead, hinted at possible changes down the road for forms. Though concrete plans are far off, the team is investigating how to bring the existing forms implementations together into a unified system.

Minor Releases

Regarding fresh releases, little happened of note—Playwright, the framework for end-to-end testing, was bumped to version 1.36.

ChangeLog