w Praktyce
7 godz. 1 min · Angular · Full-stack i Programowanie
Mateusz KuleszaSenior Software Developer, Konsultant, TrenerPodstawą produktywnej pracy z angularem jest możliwość zagwarantowania że wszystko działa bez potrzeby wielokrotnego “przeklikiwania” poszczególnych ekranów. W pierwszej części kursu omawiam więc temat testów automatycznych.Już po obejrzeniu pierwszych lekcji zobaczysz dlaczego warto testować kod i jak dzięki narzędziom dostarczonym z angularem jest to proste. Zobaczysz jak testowanie automatyczne pozwoli zaoszczędzić Ci wiele godzin spędzonych na szukaniu błędów.
Za jakość aplikacji odpowiada nie tylko to czy działa ona poprawnie, ale w dużej mierze decyduje o tym dobry interfejs użytkownika oraz UX, czyli user experience. Dwie kolejne sekcje kursu poświęcone są właśnie dobremu UI oraz UX. Omawiam typowe problemy w oparciu o zasady i wskazówki specyfikacji Google Material Design - jednej z najbardziej szczegółowych specyfikacji UX. Wszystkie przykłady UI zarówno w wariantach desktopowych jak i mobilnych omówione są na przykładzie Angulara oraz obszernej biblioteki komponentów Angular Material. Zobaczysz nie tylko jak korzystając z gotowych komponentów błyskawicznie budować nowe funkcjonalności, ale przy okazji omówimy wiele praktycznych wskazówek oraz dobrych praktyk UX które warto wykorzystać w Twoich aplikacjach.
W ramach budowania interfejsów skupimy się na najmniejszych szczegółach takich jak prawidłowe zachowanie linków, przycisków oraz wskaźników przechodząc stopniowo do coraz większych elementów aplikacji takich jak nawigacja, układ strony, paski nawigacyjne czy okna dialogowe. Przy każdym etapie czeka Cię masa wskazówek, przykładów i rozwiązań typowych problemów user experience.
Jednak UX to nie tylko wygląd i zachowanie pojedynczych elementów. W ostatnich sekcjach kursu dowiesz się jak projektować bardziej złożone interakcje z użytkownikiem. Zobaczysz wieloetapowe formularze kreatora oraz dowiesz się jak zarządzać stanem aplikacji oraz różnymi źródłami danych. Pokaże Ci jak zbudować samodzielnie sortowane, filtrowane i stronicowane źródła danych oraz połączyć je z różnymi komponentami UI takimi jak listy czy datagrid.
Na koniec kursu zobaczysz jak możemy różne gotowe elementy UI połączyć w przepływ ekranów budując ścieżkę użytkownika. Zobaczysz jak prawidłowo zaprojektowane komponenty wraz z dobrze zaplanowanym UX pozwalają być niesamowicie produktywnym jednocześnie nie poświęcając jakości czy dobrej architektury aplikacji.
Jest to kurs dla osób które już pracowały z angularem i chciałyby wyjść poza pojedyncze techniki oraz poznać proces projektowania aplikacji w praktyce z uwzględnieniem najlepszych praktyk programistycznych oraz user experience. Zarówno w wariancie webowym jak i projektując pod urządzenia mobilne.
Angular 6, 7, 8+
W poprzedniej lekcji udało nam się dać tej
Pani nację czyli stronicowania do naszej tabeli z opcją wyboru ilości elementów.
I to wszystko oczywiście działa przez nasz dataset oraz który zbiera te parametry
wysyła na serwer przy połączeniu z naszą tabelą i wyniki są publikowane na dzisiaj.
Teraz taki mechanizm pozwala nam rozszerzyć to o inne dodatkowe rzeczy.
Dodatkowe informacje dla
danych, na podstawie których robić zapytań do serwera możemy dodać tutaj filtrowanie
sortowanie do sortowania Mamy tutaj dyrektywę mat sort, czyli po pierwsze
trzeba dodać tutaj moduł ma co to czytaliśmy w poprzednich lekcjach,
więc ja po prostu tylko na tym naszym tutaj mat table sztabu czy naszej tabeli
dodamy dodatkowy parametr będzie to ma co to jest ma co pozwoliłoby mi tutaj
wyciągnąć jeszcze jakieś zdarzenia przed ma Court change test event emiter.
Mógłbym tu przypiąć po prostu zdarzenie wykonanie funkcji.
Ja jednak zrobię to tak samo jak przy nacji, mianowicie taki ma sort.
Spróbuję tutaj do tego typu się dostać przy użyciu View.
Czyli nasz komponent Task component.
Dodam kolejny filtr w ten sposób
i tym razem nie będzie to pielęgnacja tylko będzie to sort.
OK.
I też subskrybuję analogicznie jak w przypadku Terminatora tutaj sort.
Ma różne opcje czy jest aktywny, aktywny,
może dodać, zmienić kolejność, włączyć, wyłączyć różne opcje.
Mnie interesuje tutaj
nie sort czy ustawienie tylko event limiter sort change.
Za subskrybuje się i tu będziemy mieli zmianę sort.
I tę metodę sort, która powinna otrzymać tutaj.
No właśnie, co to jest za typ?
Zobaczmy, co dostaniemy tutaj, jeśli dostaniemy event.
Nagłówek.
Gdzie jest nasz atut.
Tu dostajemy obiekt typu sort i obiekt typu sort.
W dokumentacji mamy Mad sort, czyli parametry, które możemy przekazać
i sort, czyli która nasza kolumna jest aktywne, sortowanie na której
kolumnie oraz kierunek rosnąco malejąco czyli obiekt typu sort.
Czyli tu powinniśmy dostać.
Sort jeszcze importuje i teraz karze na naszym
źródle danych karzą wygenerować metodę set sort, ponieważ powinna mieć właściwe typy.
Zobaczmy które się tam dodał.
Sort nie zaimportować.
Trzeba importować ręcznie żarówkę
za importuj tutaj sort ok i zrobić to analogicznie nie warto.
Sortowanie, filtrowanie czy jakiekolwiek inne parametry, które chcemy przekazać.
Ja to w SQL mogę zrobić też w analogiczny
sposób, czyli kolejny obiekt on będzie pamiętał to sortowanie aktywne.
OK.
Terminarz sport.
Domyślne sortowanie.
Na początku ustawiłem, żeby nie było żadnego, ale żeby kierunek był rosnący.
Czyli to myślę, że żadna komórka nie będzie sortowania.
I to oczywiście aktywuje nasz nowy sort czyli sort Next.
Przekazujemy sort.
Czyli analogicznie robimy to jak w przypadku inercji.
Proces się pojawi tutaj z naszym Connected.
Jak to połączyć razem ze sobą?
Ale nim przejdziemy tu już jeszcze bardzo ważna rzecz potrzebna.
Dodanie sort u góry samej tabeli nam jeszcze niewiele pomaga.
Musimy oznaczyć, które kolumny są
sortowane, czy musimy je dodać do naszych u góry nagłówków Mad sort Header.
I teraz tak możemy sortować po ID, czyli nasz header
będzie miał co prawda, ale podmenu nie będziemy sortować, więc to
pominę tytuł i tu jeszcze mamy status completed,
tylko żeby na pewno było to na nagłówku, czyli Matched Cell.
Tutaj jest szablon match sort header status OK, czyli tutaj gdzie mamy
tytuł naszej kolumny, tam dodajemy po prostu dyrektywę do sortowania
i teraz to nam powinno elegancko dodać nie tylko informację o tym, którą kolumnę ID
czy tam nazwę definicji kolumny, ale też zobaczymy nasz projekt teraz.
Tu nam się pojawiają takie strzałki.
I teraz tak na dole pierwszy dostajemy
tutaj nasz domyślny wiersz Subject publikuje nam Active Direction.
Tutaj to co ustawiam na początku.
Jeśli spróbuję zmienić to sortowanie czy gdzieś kliknę powiedzmy w tą kolumnę mamy
Active ID rosnąco malejąco Tytuł rosnąco malejąco Status rosnąco malejąco menu.
Oczywiście nie ma czegoś takiego.
Klikając trzeci raz tutaj robię direction pusty, czyli jeśli direction jest pusty.
Tu wyłączyłem sortowanie.
Na to też trzeba zwrócić uwagę.
OK, teraz możemy te informacje wykorzystać do naszego zapytania.
Problem pojawia się tutaj taki, że
się zasób kupiliśmy na page, a chcemy jeszcze zasubskrybować na sort.
I co z tym zrobić? Musimy połączyć jedno to tutaj z tym
drugim, zamiast się subskrybować troszkę inaczej.
Podobnie jak z Page zrobię tutaj mapowanie, czyli tu będzie sort.
I zobaczmy na nasze parametry co tam mamy.
Potrzebuję sort i order.
To ja to sobie dodam tutaj do naszego query parametry
naszego typu na samej górze, że potrzebujemy jeszcze sort String order.
Tu będzie standing.
Mogę też tak zapisać tę standing lub pusty string.
Tak? Tylko te trzy opcje są dostępne.
Sortem może być dowolna nasza kolumna.
Dobra, czyli teraz tak tutaj jeśli ja ustawię może ten typ?
Mamy już mamy Active i Direction Active Direction.
OK.
Czyli tutaj muszę ustawić sort.
Activ.
I order to jest Direction.
Czy musimy przemalować nazwy tutaj dostępne?
U nas w tym właśnie sortowaniu na nazwy,
których potrzebuje nasz serwer do działania.
OK, teraz musimy takie coś połączyć z tym.
Mamy tutaj dwa źródła parametrów i musimy to wszystko wsadzić w jeden tutaj nasz.
Co z tym zrobić?
Jeśli mamy dwa różne źródła informacji to możemy użyć np.
czegoś takiego jak Combine latest test nie z operatorów
tylko tutaj po prostu bezpośrednio z RG i tu przekażę sort changes.
Czyngis.
I przypisywać je do zmiennych.
To wszystko było dla nas czytelne.
Czyli będziemy mieli.
Zmiany sortowania jednym strumieniem danych, jednym obserwatorem.
Czy to jest wszystko jeszcze jeden nawias ok.
I drugi ten cały type nazwę page changes.
OK. Teraz możemy je połączyć.
Strumień, który będzie zawierał teraz jedno i drugie.
Teraz ten strumień ma pojemnik na to, co potrzebujemy.
Po prostu jest tablica.
Tu jest tablica, która będzie zawierała wszystkie informacje na temat sortowania.
I musimy te informacje połączyć w jeden obiekt,
który tutaj chcemy do serwera przekazać, czyli query parametr to musimy uzyskać.
I teraz tutaj tak, wszystko co się pojawi
stąd, czyli sortowania inaczej łączymy razem w jeden obiekt np.
sort.
Także.
I teraz powinienem być w stanie tego typu.
Reszta naszych elementów, czyli switch zobaczyć który koszyk się zmieni.
Jeśli zmieni się sort
to jest tak jak nazwa wskazuje połączy z ostatnim zapamiętanym page changes.
Jeśli zmieni się page changes połączy, to zostanie zapamiętanym sort changes.
Dzięki temu zawsze ludzie mieli pełne parametry potrzebne.
Ci, których nie ma użyję domyślnych, jeśli któryś nie ma.
Z drugiej strony użyj poprzednich + najnowszy tutaj wyemitowane Czy łączymy
dwa strumienie i kasujemy ostatni parametr?
Powinien dostać wszystkie parametry, czyli tu powinniśmy mieć także parametr.
Sort.
I powinniśmy mieć parametr direction.
Tutaj nic nam się nie popsuje.
Czy ten order ok.
Tutaj w konsoli możemy zobaczyć jakie parametry wysyłamy na serwer.
Czyli na starcie wysyłamy sort pusty order rosnący Page 0 PR 10.
Pamiętamy, że Page się powiększa na końcu 1, więc z tym nie będzie problemu.
Może jeszcze powiększenia 1 wcześniej zrobić np.
gdzieś już np.
tutaj powiększyli, to wtedy w logu też będziemy mieli od razu
faktycznie te parametry, które idą do serwera.
OK, teraz tak.
Jeśli według panikował.
Same wszystkie parametry.
OK, jeśli będę filtrować.
Też wysyłamy wszystkie parametry, czy
możemy połączyć różne elementy i filtrowanie?
Chciałem jeszcze dodać wyszukiwarkę, dołączyć tam np.
tekst, który chcemy wyszukać itd.
No to polecam Tobie też jako ćwiczenie zrobić coś takiego.
Czyli dołączę przez jakiś input,
zasubskrybować te zmiany, przekazać je jako kolejny
rodzaj parametru do naszej wyszukiwarki, połączyć czy combine latest.
Jak widzisz możemy też dodać po przecinku kolejne tutaj parametry tutaj
w tablicy jako kolejne parametry i możemy też je przekazać do naszej wyszukiwarki.
Jak widzisz bardzo fajnie.
Każdy element tutaj zajmuje się tylko swoją rolą.
Każdych obserwujemy, obserwujemy te zmiany, łączymy je razem.
Wynik przekazujemy tutaj do serwera,
a nasze Tableau cały czas czeka na takim obiekcie data.
Więc jeśli serwer odpowie danymi, odpowie
wynikami to wsadzając w to data znowu obserwująca tabela powiadomiona.
W ten sposób każdy z elementów jest niezależny.
To źródło danych tutaj steruje tymi wszystkimi elementami z jednego miejsca,
więc jest to bardzo fajny mechanizm elastyczny rozszerzane mechanizmu do
zarządzania danych danymi, szczególnie danymi, które muszą być filtrowane,
sortowane tagi chowane i wyświetlane w różny sposób.
Wcale nie musisz używać tylko z tabelą.
To jest tego przykład.
Możesz własne komponenty, listy, tabele,
drzewka, inne elementy także konstruować z takim data source i mieć bardzo fajny,
elastyczny system zarządzania, który jak widzisz elegancko pracuje z różnymi
komponentami Material Design, ale nie tylko.
Tak więc polecam taki data, żeby oddzielić właśnie wygląd naszych komponentów od
struktury danych jako bardzo fajny, ciekawy mechanizm zarządzania danymi.