Angular’s NG0600 means code called set() or update() while Angular was evaluating a computed, a linkedSignal computation, or a template. Find the write named in the stack trace, then move it to the right pattern: use computed for derived state, linkedSignal for derived state that must remain writable, and an event, lifecycle point, or effect for an actual state change or side effect.
What triggers NG0600?
Angular raises NG0600 when a signal is written during a reactive read or rendering. A computed is meant to calculate a value from signals; a template is meant to read state to render the view. Mutating another signal from either evaluation mixes a state change into work that may run again as dependencies change or Angular checks the view. The same rule applies inside a linkedSignal computation. See Angular’s NG0600 error reference.
As an Amazon Associate I earn from qualifying purchases.
For example, this code tries to update total while doubled is being evaluated:
Quick wins for a faster PC:
Clear out junk files and repair common Windows errorsFree Scan →Scan for outdated or missing drivers - takes under a minuteDriver Scan →Repair Windows errors before they cause bigger problemsFix Now →count = signal(1);
total = signal(0);
doubled = computed(() => {
this.total.set(this.count() * 2); // NG0600: write during computation
return this.count() * 2;
});
The problem is not the arithmetic; it is the write inside the computation. If total is only another name for a value derived from count, do not store and synchronize a duplicate. Define the derived value directly.
#1 Best Overall
How to locate the disallowed write
- Read the NG0600 message to determine whether Angular reports a write during a
computedevaluation or template rendering. - Follow the stack trace to the signal’s
set()orupdate()call. - Trace from that call to the code that invoked it: a
computed,linkedSignalcomputation, template expression, or method called by the template. - Decide whether the value is derived, derived but manually writable, an actual state transition, or a side effect. Apply the matching pattern below rather than moving the same write into another reactive calculation.
Choose the replacement pattern
| What the code needs | Use | Why |
|---|---|---|
| A value determined only by other signals | computed |
Expresses derivation directly without storing duplicate state. |
| A value derived from a source but also set by users or application logic | linkedSignal |
Provides a writable value that can track a source. |
| A genuine interaction with a non-signal or imperative API | effect |
Effects are suited to side effects such as storage, logging, custom DOM behavior, or third-party APIs. |
| A state change caused by an actual user action | Event handler or suitable lifecycle/output point | Keeps the write at the point where the state transition occurs. |
Use computed for values that are only derived
Replace the earlier example with a computed value:
count = signal(1);
doubled = computed(() => this.count() * 2);
Now doubled updates as count changes, without a second signal that must be kept in sync. Angular’s Signals guide recommends computed signals for derived state.
Use linkedSignal when derived state must stay writable
If a value should follow a source but users or application logic must also be able to set it, consider linkedSignal rather than writing to a separate signal from a computed. Its computation should derive the linked value; do not use it as a place to write to other signals. See Angular’s linkedSignal guide.
Rank #2
Keep template-triggered writes out of rendering
A method called by a template still runs as part of rendering. Hiding a write inside a method does not make it safe:
Free tools Windows power users keep installed
One-click scans. No signup required.
label() {
this.views.update(value => value + 1); // still a write during rendering
return 'Views';
}
If a click should change the value, update it in the event handler. For other transitions, use the lifecycle or output-handling point that actually owns that change. Angular lists event listeners, lifecycle hooks, output handlers, and effects among contexts where signal writes are allowed.
Rank #3
Reserve effects for side effects, not routine state copying
An effect can be appropriate when a signal change must synchronize with something outside the signal graph—for example, browser storage or an imperative third-party API. It is usually the wrong tool for copying one signal into another just to represent a derived value. Angular warns that state propagation through effects can lead to expression-changed errors, circular updates, or unnecessary change-detection cycles. Prefer computed or linkedSignal when those express the relationship. See the effect guide.
Does allowSignalWrites fix NG0600?
Advice about allowSignalWrites depends on Angular version. The current CreateEffectOptions API reference marks it deprecated and says it is no longer required because signal writes are allowed by default in effects. By contrast, the Angular v18 Signals guide described writes in effects as disabled by default and showed allowSignalWrites as an opt-in.
Rank #4
That version difference concerns writes in effects; it does not make writes during computed evaluation or template rendering a suitable pattern. Check the documentation for your Angular version, and first ask whether the write belongs in an effect at all. If it merely propagates derived state, use the appropriate derivation API instead.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Quick Recap
Common fixes that do not solve the underlying problem
- Moving the write into a helper called by a template: the helper still executes during rendering.
- Writing a derived value into a second signal: use
computedwhen the value is fully determined by other signals. - Moving routine signal-to-signal synchronization into an effect: this can create extra updates or cycles; use an effect for a real side effect.
- Adding
allowSignalWriteswithout checking the Angular version and context: current API guidance says it is deprecated and unnecessary in effects, while Angular v18 documented older behavior. It does not address a write during a computed or template evaluation.
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




