Start / Blog

Blog

Warum dein Angular-Effekt nur einmal läuft

Es ist ein Fehler, den man nicht sieht: Der Effekt läuft beim ersten Mal, tut genau das Richtige — und danach passiert nichts mehr. Keine Fehlermeldung, kein roter Test. Nur eine Ansicht, die stehen bleibt.

Abhängigkeiten werden synchron gesammelt

Ein Signal benachrichtigt seine Leser, wenn sich der Wert ändert. Wer als Leser zählt, ermittelt Angular dynamisch: Nur Signals, die während des Durchlaufs tatsächlich gelesen wurden, werden zu Abhängigkeiten.

Diese Erfassung endet beim ersten await. Was danach kommt, läuft in einem späteren Tick — und zählt nicht mehr dazu. Ein effect(), der sein Signal erst nach dem await liest, registriert also keine einzige Abhängigkeit. Er läuft einmal und nie wieder.

Das Gegenmittel ist unspektakulär: die Signals ganz oben lesen, in lokale Variablen, und erst danach await. Umgekehrt gibt es untracked() für den Fall, dass man einen Wert braucht, aber nicht auf ihn reagieren will.

Meistens ist der Effekt selbst das Problem

Die häufigere Ursache ist ohnehin, dass da gar kein Effekt hingehört. Einer, der zwei Signals von Hand synchron hält, ist fast immer ein computed(), das noch nicht geschrieben wurde. Und einer, der ein Signal schreibt, das er selbst liest, läuft im Kreis.

Die Faustregel: Was sich errechnen lässt, wird nicht gespeichert. Effekte bleiben für das, was aus Angular hinausführt — Protokollierung, fremde Bibliotheken, der Zugriff aufs DOM.

Mehr dazu im Seminar

Wie signal(), computed(), linkedSignal() und effect() zusammenspielen — und wann welches davon das richtige ist — zeigt das Modul Signals: Zustand modellieren aus dem Seminar Angular für erfahrene Entwickler, inklusive Video und Kapitelübersicht. Die Kurzform zum Danebenlegen steht im Angular 22 — Kern Cheat Sheet.

← Alle Beiträge