Anwendungszustand mit NgRx SignalStore
signal() , das tief unten in einer Komponente vergraben ist. Sobald ein Zustand von mehreren Stellen aus geteilt, abgeleitet und mutiert wird, möchte man eine klare Grenze: schreibgeschützte Selektoren, Methoden, um ihn weiterzuentwickeln. NgRx SignalStore ( @ngrx/signals ) bietet genau das, ohne das Actions/Reducer-Boilerplate des klassischen NgRx.
Anatomie eines signalStore
withState deklariert den initialen Zustand, withComputed die abgeleiteten Werte, withMethods die Operationen. Jedes Zustandsfeld wird automatisch zu einem Signal, das auf der Instanz verfügbar ist.
patchState , das ein unveränderliches Update anwendet und die betroffenen Signals benachrichtigt.
Selektoren als Signals
store.total und store.count sind keine Funktionen, die im Service aufgerufen werden: Sie sind computed , also vollwertige Signals. In einer Komponente liest man sie wie jedes andere Signal, und die zoneless Change Detection rendert nur das neu, was von ihnen abhängt.
Komposition mit asynchronen Aufrufen
withMethods kann rxMethod (aus @ngrx/signals/rxjs-interop ) einbinden, um einen RxJS-Stream anzubinden, oder einfach async / await für einen fetch . Die Orchestrierungslogik bleibt im Store, die Komponente bleibt eine View. Hier platziert man auch einen loading -Zustand für ein Stale-While-Revalidate-Pattern.
Store oder einfaches Signal?
signal() : Ein Store würde hier nur unnötige Indirektion hinzufügen. Der SignalStore ist sinnvoll, wenn der Zustand:
- ›
zwischen mehreren Komponenten oder Routen geteilt wird; - ›
von mehreren computedabgeleitet wird, die man zentralisieren möchte; - ›
durch Operationen mutiert wird, die man isoliert testen möchte.
Der SignalStore ist nicht das NgRx „Actions überall" von gestern. Es ist eine Signal-Fassade: schreibgeschützt als Ausgabe, Methoden als Eingabe, kein Reducer. Man behält die Disziplin eines Stores, ohne dessen Zeremoniell zu bezahlen.