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+
Witaj w kolejnej lekcji tym razem spróbujemy zbudować sobie
taką tabelę w stylu material design która będzie dynamiczna
czyli będziemy mogli sterować tym jak wyglądają poszczególne komórki kolumny
nagłówki oraz będziemy mogli podłączyć różne źródła danych czyli
manipulować tutaj zawartością tej tabeli tak danymi które pojawiają
się nam w takiej tabeli teraz żeby taką tabelkę tutaj użyć
możemy użyć po prostu właśnie takich specjalnych dyrektyw tej
tabeli ja to zrobię tutaj w specjalnym tym takim komponencie tasks
które stworzyłem wcześniej tutaj tez stworzyłem sobie serwis
z przykładowymi danymi tasks data service gdzie
będziemy mogli zrobić query taska pofiltrować posortować sobie te
dane i to idzie nam zwracało tutaj observable czyli nie będzie to działało wyglądało
w taki sposób jakby te dane faktycznie były pobierane z prawdziwego serwera czyli
tak po pierwsze do app module trzeba dodać odpowiednie tutaj do material
module dodać odpowiednie moduły czyli dodam sobie mat table
module tutaj można także od razu dodać sobie
mat paginator module oraz
mat sort module z których skorzystamy
później okej teraz wracając do komponentu jeśli chciałbym tutaj
wyrenderować taką tabelę to po prostu zacząć od zwykłej tabelki takiej
html tutaj do tego musimy dodać oczywiście mat table i
podamy tutaj źródło danych i teraz źródło danych po prostu
data source data source w ten sposób mogło być nawet
prostą tablicą i zaczniemy może od tego że ten data source na początku no
zrobimy żeby to była po prostu jakaś prosta tablica
w którą umieszczę jeden element będzie miał on id może title
i completed true
czyli jakieś takie przykładowe jedno zadanie i teraz aby wyświetlić
elementy tego data source czyli naszego źródła
danych w przypadku prostej listy nie musimy tu robić ng for
nie musimy ręcznie tworzyć wierszy kolumn wystarczy zdefiniować poszczególne
szablony dla elementów tej tabeli czyli stworzę sobie
ng container ng container
tutaj stworzę szablon template jednej komórki czyli
tak td jest to jedna komórka i teraz tu używając gwiazdki
zamieniam to na template i mogę powiedzieć że jest
to mat cell def czyli definicja
jednej komórki i tutaj mogę przypisać sobie do zmiennej jakiej chcę
na przykład row zawartość właśnie jednego wiersza i
w każdej kolumnie mogę odnieść do tego wiersza i wyciągnąć ten element który potrzebuję na przykład
id i wtedy to nazwiemy sobie że jest to
mat column definition definicja kolumny jeśli kolumna
jest to kolumna id i w ten sposób możemy postąpić dla kolejnych
elementów czyli gdybym chciał tu jeszcze dodać powiedzmy
name to analogicznie nazywam kolumnę name no i mogę
wyciągnąć sobie na przykład z tego elementu name albo title tak
może być to title nie musi się to zgadzać ja zrobię w ten sposób żeby było
prościej i to nie wszystko to nam jeszcze nie wyrenderuje tej naszej tabeli
trzeba zrobić tak że tutaj definicję wiersza tr
i teraz po co to wszystko w ten sposób możemy korzystać z różnych tagów
to nie musi być tabela możemy użyć tutaj dowolnej struktury html dowolnych css'ów
tylko że oznaczyć poszczególne jakby elementy które
reprezentują którą część tabeli to musi być tabela to może być właśnie dowolna html jest to duża
dowolność jeśli chodzi o wiersz tutaj
w dokumentacji mamy szablon wiersza musi być
to dyrektywa mat row i tutaj
także mamy gwiazdkę czyli ten tr
tutaj to nie będzie element tylko będziesz szablon tak gwiazdka oznacza że to jest to
template który będzie mógł go
duplikować wielokrotnie i tu mogę powiedzieć sobie że
aktywne kolumny że aktywne
kolumny no to na przykład właśnie jest id i title tak
i on użyje tych nazw które tu pytaliśmy żeby wiedzieć które z tych szablonów wyrenderować
jako kolumny komórki w tym wierszu naszej
tabeli jeszcze coś jest nie tak mat cell
mat row
i on tu konieczne upiera się żeby zrobić nagłówek okej
nie ma problemu możemy także tutaj definiując kolumny
zdefiniować nie tylko komórkę ale możemy także definiować nagłówek
czyli mat header cell mat
header cell def tutaj
nie mamy pojedynczego wiersza bo jest to wiersz nagłówka więc możemy dynamicznie tutaj
określić wartości bo zawsze to będzie to tylko jeden nagłówek mogę powiedzieć tutaj po prostu tutaj na sztywno
że jest to id no i analogicznie tutaj powiedzieć że jest title
no i w ten sposób też możemy zrobić tutaj
wiersz nagłówka czyli mat header row mat
header row def tutaj
tego już nie ma tu będą już tylko kolumny same możemy określić nic
więcej zobaczmy mat header cell header row def tutaj
już tylko tak z same kolumny
przekazujemy okej jak usunę nagłówki to mogę tu zmienić na th
tak tutaj był header czyli jak widzisz
definiujemy tylko poszczególne szablony poszczególnych elementów czy
to zadziała kompiluje
się okej dobra
coś tu jeszcze jest nie tak jak widzisz nagłówki się wyrenderowały coś tu jest
nie tak z wierszami o tak oczywiście nie zamknąłem klamer okej
ta tabela jest jeszcze wąska więc od razu pozwolę sobie tutaj dodać jakiś
styl powinienem to zrobić i osobno ale tak na szybko
wtedy szerokość tej tabeli żeby nam wypełniła całą
szerokość tego ekranu no i mam tutaj tabelę która
tutaj wyświetla nagłówki i wyświetla treść zwróć uwagę że tutaj
strukturę tej tabeli jest zupełnie dynamiczna czyli możemy dynamicznie określić jaka
jest struktura tych nagłówków czyli na przykład active columns to
może być tutaj także zmienna skonfigurowana tu czyli mogę ustawićsobie jakie
są aktywne kolumny i teraz
zmieniając zawartość tej active columns możemy zmienić strukturę tabeli
możemy włączyć wyłączyć pokazać schować różne kolumny możemy
też zamienić kolejnością na przykład te elementy okej to za chwilkę ja tu
spróbuję zobaczyć sobie czy w komponentach material design jak
pamiętasz mieliśmy tutaj taką opcję
menu rozwijanego no właśnie tego typu i
co moglibyśmy zrobić bo mógłbym zrobić coś takiego żeby
tutaj ten nagłówek powiedzmy aktywne kolumny mógłbym
także zrobić na przykład osobno nagłówki
header i wykorzystać
active columns i dodać do tego jeszcze jakąś specjalną kolumnę na
przykład menu i tu moglibyśmy
zdefiniować jeszcze jeden specjalny taki element nazwać
go menu spróbujemy bez definicji jednej
komórki zobaczymy czy nie będzie krzyczał na mnie i tutaj zrobić sobie właśnie
przycisk taki z rozwijanym menu czyli mat menu tutaj
z przyciskiem coś takiego co już robiliśmy i zobaczyć
czy uda mi się taką opcję menu tutaj umieścić w jednej z komórek
niech to się nam przekompiluje zobaczymy pojawiło się menu
settings i tak dalej tutaj jego szerokość
nie podoba się no i nie podoba mi się że nie ma komórki więc trzebaby komórkę
też definiować nawet jeśli takowa po prostu nie będzie używana tak czyli
tutaj musimy zdefiniować tak że szablon dla komórki nawet jak
nie chcemy tych elementów wyświetlać no nawet w razie gdyby ktoś chciał kiedyś jednak
tam komórkę z menu wyświetlić
co jest ciekawe tutaj możemy umieścić na przykład także style czyli jest to definicja czy
mogę powiedzieć tutaj że style że ta kolumna powinna być bardzo wąska to
ona powinna mieć powiedzmy nie wiem 25 pikseli także aby ona nie była
taka szeroka czyli mamy bardzo fajne możliwości stylowania poszczególnych
komórek poszczególnych wierszy więc
tutaj mógłbym sobie ustawić jakie kolumny mamy dostępne filtrowanie i sortowanie tego
typu rzeczy nawet przy każdej kolumnie takie menu dodać też mamy
bardzo duże możliwości stylowania okej czyli tutaj to sobie
zostawię tutaj gdzieś pamiętasz była taka możliwość właśnie
zagnieżdżonego menu a bo tak że na przykład menu z
jakimiś tam właśnie opcjami przyciskami tego
typu rzeczy ale to sobie zostawimy wrócę do tabeli co
z tym źródłem danych tutaj mamy cały czas ten jeden rezultat co
możemy zrobić zamiast tego źródło danych może być takim specjalnym obiektem
który pozwoli nam dynamicznie podłączyć się do właśnie
jakiegoś źródła danych ja tu zrobię to w tym miejscu trochę nieelegancko powiedzmy
tasks data source
i zrobimy żeby to rozszerzało obiekt data
source który pobierzemy sobie z angular cdk table
zobaczymy i tu powiemy że to ma zawierać
obiekty typu task tak
zrobić kolekcje obiektów typu tasks okej
tasks data source okej
musimy zaimplementować dwie metody metodę connect i disconnect zobaczymy czy
to uda się automatycznie zaimplementować
okej on tu chce jedno zobaczymy się uda wszystkie od
razu żarówka prawie
dobra czyli mamy metodę connect która przyjmuje
collection viewer i powinna zwracać observable który zawiera właśnie
nasze taski tutaj to jest jeden task kolekcje
tasków to jest jedna metoda
druga metoda to jest disconnect coś
to mu jeszcze nie pasuje dodaj
importy okej i tutaj
też dostajemy collection viewer i tu już nic musimy zwracać
z void tu jest disconnect czyli jak widzisz zamiast pustej tablicy możemy ućyć specjalne metody specjalnej
klasy która ma metody podłącz i rozłącz ja
właściwie taką klasę mogę tu próbować wstrzyknąć
ale to może za chwilkę bo wziąłem potrzebne jeszcze dodam sobie konstruktor do
którego będziemy potrzebowali ten cały tasks service
najlepiej przekazać w ten sposób i wtedy tutaj jak
ktoś chce się podłączyć no
właśnie no to możemy od razu w nim jeszcze pobierzemy coś z serwera
podłączyć sobie jakieś powiedzmy prywatne data
będzie to new behavior subject i będzie to pusta
tablica na początek i powiedzmy tutaj zwrócimy return
this data as observable żeby
któś mógł się podpiąć ale jednocześnie zwracamy to tu danych i jednocześnie możemy
to tu wykonać zapytanie na przykład do serwera tutaj
jeszcze potrzebny jest super super nie wymaga żadnych tych czyli
rodzic nie wymaga żadnych parametrów i teraz zwracamy
to ale jednocześnie próbujemy połączyć się do tasks service
i wyszukać tutaj
jakieś zadania jak dostaniemy odpowiedź
to odpowiedź możemy
przekazać sobie do this data
next czyli jak widzisz
nie musimy podpinać bezpośrednio usługi zapytań do serwera
czyli możemy zrobić takiego pośrednika który pozwoli nam kontrolować w jakiś sposób
te dane są wysyłane pobierane dodatkowo
collection viewer tu jest bardzo ciekawa rzecz bo collection viewwer view change
jest to observable który będzie
zawierał takie informacje jak list range co to jest
zobaczmy jak się zasubskrybujemy na to na razie console log zobaczymy
jaki będzie efekt jak tego użyjemyja ten na razie tasks source po prostu tutaj stworzę
ręcznie czyli powiedzmy new tasks source
tasks service i
nasze źródło danych które było zwykłą tablicą zamienię tutaj na ten
nasz tasks data source tutaj się typy nie zgadzają więc na chwilkę
tutaj typy pominiemy zobaczymy co się stanie czyli
tutaj task service podłączam do źródła danych źródło danych wystawiam i nasza tabela
powinna się podpiąć tutaj do tego źródła danych wykonać metodę connect
i jak widzisz mamy tutaj pobrane 10 różnych
tu jest zapytań ale dodatkowo tutaj bardzo fajna rzecz dostajemy start
i end początek koniec tabeli i tutaj bardzo fajnie bo mamy możliwość paginacji
przewijania tak czyli jakby źródło dostaniemy informację odkąd dokąd od
start do end ile rekordów chce pobrać no i my wtedy możemy odpowiednio zareagować
czyli innym słowem możemy przekazać do tego źródła parametry
opcje ustawienia naszego zapytania ustawienia nawet tabeli i
to źródło danych jak pobierze dane to poinformuje tabelę czyli ta tabela będzie
reagowała nie trzeba jej mówić tej tabeli co trzeba zrobić ona cały czas jest podpięta
podłączone do tego źródła no i przekazując parametry różne opcje metody właśnie
na tym źródle można tym bezprzewodowo sterować tabelą takie
rzeczy jak na przykład filtrowanie sortowanie paginacja to wszystko właśnie może obsługiwać
tak żeby tabela się tym już nie musiała przejmować no ale
o tym wszystkim już kolejnych lekcjach tak więc do zobaczenia