Daten laden mit resource() und httpResource()
subscribe() , händisches State-Management ( loading , error , data ) und Speicherlecks, wenn man ein unsubscribe vergaß. Seit Angular 21 kapseln resource() und httpResource() all das in einer reaktiven Primitive, die auf Signals aufbaut.
Das resource()-Modell
resource() verknüpft eine reaktive Anfrage mit einem asynchronen Loader . Wenn ein in params gelesenes Signal sich ändert, startet Angular den Loader automatisch neu und bricht die laufende Anfrage über ein AbortSignal ab. Das Ergebnis ist ein Signal-Objekt: value() , error() , status() sowie isLoading() .
userId zu ändern: kein subscribe , kein takeUntilDestroyed . Der resource lädt neu, gibt isLoading() während des Aufrufs aus und bricht die vorherige Anfrage ab.
httpResource für REST-Aufrufe
httpResource() ist die auf HttpClient zugeschnittene Variante: Sie durchläuft die Interceptoren, verwaltet die Typisierung der Antwort und reagiert auf URL-Änderungen. Man übergibt ihr eine Funktion, die die aus Signals abgeleitete URL (oder ein vollständiges Anfrage-Objekt) zurückgibt.
async -Pipe:
Die Zustände und ihre Tücken
status() gibt einen der Werte idle , loading , reloading , resolved , error und local zurück. Zwei Feinheiten verdienen Beachtung:
- ›
Während eines Neuladens behält value()die alten Daten (reloading), was einen weißen Bildschirm verhindert — praktisch für ein Stale-while-revalidate-Pattern. - ›
httpResourceist für das Lesen (GET) gedacht. Für POST/PUT bleibt man beim klassischenHttpClient: Ein Resource startet neu, sobald sich seine Anfrage ändert, was bei einer Mutation keinen Sinn ergibt.
Warum manuelle Subscriptions aufgeben
resource wird die Abhängigkeit deklarativ — der Loader startet neu, weil sich ein Signal geändert hat, Punkt. Man entfernt die Paginierungs- BehaviorSubject s, die defensiven switchMap s und die finalize -Aufrufe, um loading wieder auf false zu setzen. Die offizielle Dokumentation beschreibt die API im Async-Guide mit resource .
resource()ersetzt nicht RxJS: Es ersetzt den Boilerplate . Du beschreibst, was geladen werden soll und wovon es abhängt; Angular kümmert sich um das Wann, den Abbruch und den Zustand. Die Komponente wird wieder zu einer einfachen Signal-Lektüre.