When an Angular feature is mostly local to a screen, signals are often enough.
That does not mean every application should stay tiny forever. It means the burden of proof should be on adding more machinery, not on keeping local state small, explicit, and close to the component that owns it.
What signals do well
Signals make a few common tasks pleasantly direct:
- storing local UI state
- computing derived values
- keeping templates readable
- making updates explicit with
set()andupdate()
The biggest win is not novelty. It is legibility.
What to avoid
It is easy to recreate old indirection with new primitives. A signal-heavy architecture can still become hard to reason about if every value is pushed through layers of helpers before the template sees it.
The better default is:
- keep state near where it is used
- derive values with
computed() - move logic to services only when ownership is clearly shared
That keeps the codebase calm for longer.