Wróć do strony głównej
Angular

Współdziałanie sygnałów i RxJS w Angularze na praktycznym przykładzie

Współdziałanie sygnałów i RxJS w Angularze na praktycznym przykładzie

Sygnały w Angularze to nowy reactive primitive, który usprawni sposób w jaki tworzymy aplikacje w angularze ora zpoprawi Developer Experience. Znacząco również wpłynie na mechanizm detekcji zmian.

W tym artykule wyjaśnię, jak utworzyć komponent oparty na sygnałach. Dzięki praktycznemu przykładowi dowiesz się: 

  • Jak przekształcić RxJS observable na sygnał
  • Jak przekształcić sygnał na observable

Wszyscy lubimy wizualizacje, a więc zobaczmy, co zamierzamy stworzyć.

Poniższy kod jest naszym punktem wyjścia. Usprawnimy go wprowadzając koncepcję
sygnałów.

Konwersja z RxJS observable na sygnał

Zacznijmy od pobrania danych z serwisu, przekształcenia go do sygnału i przeiterowania
przez elementy tworzące opcje autocomplete’a. 

Metoda  <span style="font-weight: 400;">get</span><span style="font-weight: 400;">()</span>

  • Przyjmuje userId jako argument
  • Wyrzuca błąd jeżeli userId wynosi 100
    (to jest tylko manualny sposób na rzucenie błędu abyśmy mogli zobaczyć jak zaaplikować podstawową obsługę błędów)
  • Stosuje sztuczny delay, aby umożliwić wyświetlenie loader’a

Tak jak wspomniałem powyżej, przejdziemy przez to wszystko krok po kroku.

W poniższym kodzie, wykorzystujemy metodę toSignal, która przyjmuje observable i zwraca
sygnał oparty na wartościach otrzymanych z observable. Warto zaznaczyć, że subskrypcja do observable zarządzania
jest automatyczna, oraz jest czyszczona kiedy injection context jest niszczony. 

Przeiterujmy teraz po obiektach Post w szablonie HTML. Zauważ, że musimy użyć nawiasów,
aby uzyskać wartości z sygnału. Może się to wydawać złym podejściem gdyż uczyliśmy się, że metody w szablonie
wywoływane są przy każdym cyklu detekcji zmian, jednakże nie dotyczy to sygnałów.

Jak dotąd udało nam się wykonać pierwszy krok wykorzystując jedynie metodę toSignal. Spróbujmy teraz uzyskać dane wejściowe użytkownika i przesłać je do serwisu.

Konwersja sygnału na observable

Powiązanie Binding do inputa również będzie oparty na sygnałach. Nazwiemy go userId, którego
wartość początkowa wynosić będzie undefined.

Musimy zastosować two-way data binding, ale jako że jeszcze nie możemy wykorzystać jego
składni, oddzielimy property binding wykorzystując event binding. (Podczas pisania artykułu wersja Angulara wynosi 16.0.4)

Aby wysłać żądanie HTTP za każdym razem, kiedy wartość userID się zmieni, możemy wykorzystać kombinacje efektu oraz BehaviourSubject, tak jak widać poniżej.

Podejście to działa prawidłowo, jednak wymaga od dewelopera zarządzania subskrypcją. 

Wydaje się jednak, że jest to wzorzec, którego możemy użyć za każdym razem, gdy łączymy sygnał z niektórymi operatorami RxJS. Z tego względu zespół Angulara stworzył metodę toObservable, która przekształca sygnał do observable oraz automatycznie zarządza jego subskrypcją. Dzięki tej metodzie, kod znacząco się skróci.

W powyższym kodzie mamy pole posts$, który ma bardzo krótki cykl życia, gdyż jest przekształcany na sygnał za pomocą metody  toSignal. Poprawmy to trochę i użyjmy operatora debounceTime.

Jako że przekonwertowaliśmy sygnał do observable, możemy zastosować operatory RxJS do obsługi stanu ładowania wraz z obsługą błędów. Stan ładowania obsługujemy za pomocą sygnału isLoading signal<boolean>.

I to wszystko!

Na koniec podzielę się kilkoma sugestiami: 

  • Postaraj się nie wykorzystywać async pipe’a w szablonie HTML, zwiększy to ilość cykli detekcji zmian
  • Spróbuj przekształcić stan twojego komponentu do sygnału
  • Nie obawiaj się korzystania z operatorów RxJS
  • Postaraj się wykorzystywać efekty w celu tworzenia logów bądź przy manipulacji DOM.

Możesz również obejrzeć film opisujący przedstawiony przykład na moim kanałe Youtube: 

Learn Angular Signals RxJS Interop From a Practical Example

Dziękuję za przeczytanie mojego artykułu.

O autorze

Fanis Prodromou

Jestem full-stack web developerem z pasją do Angulara i NodeJs. Mieszkam w Atenach-Grecji i pracowałem w wielu dużych firmach. Podczas moich 14 lat kodowania zdobyłem ogromne doświadczenie w zakresie jakości kodu, architektury aplikacji oraz ich wydajności.

Zdając sobie sprawę z tego, jak szybko rozwija się informatyka i aspekty techniczne, staram się być na bieżąco, uczestnicząc w konferencjach i meetupach, studiując i próbując nowych technologii. Uwielbiam dzielić się swoją wiedzą i pomagać innym programistom.

„Sharing is Caring”

Uczę Angulara w firmach korporacyjnych poprzez instytut Code.Hub, piszę artykuły i tworzę filmy na YouTube.

Zapisz się do naszego newslettera. Bądź na bieżąco z najnowszymi trendami, poradami, meetupami i stań się częścią społeczności Angulara w Polsce. Rynek pracy docenia członków społeczności.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *