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 dotyczących formularzy w angular material jak
pamiętasz z poprzednich lekcji do każdego pola mogliśmy dodać sobie taki element jak
mat hint czyli taką podpowiedź informację dodatkową do danego
pola jeśli jest to opis naszego tutaj zadania które dodajemy w formularzu to
podam taką pomocniczą informacje keep it short
i oczywiście ta informacja nam się wyświetli tutaj bezpośrednio pod polem ona
jest cały czas widoczna nieważne czy pisze cały czas ją tutaj widać można ją umieścić
po lewej stronie możemy ją umieścić po prawej stronie jest tu
informacja jest wskazówką jeśli jednak coś pójdzie nie tak wpiszemy nieprawidłową
wartość zapomnimy wpisać wartość no to powinniśmy wyświetlić tutaj nie informację
tylko komunikat błędu do tego mamy też specjalny element nazywa się to
mat error i na przykład jeśli ktoś wpisze tutaj no
właśnie nie wpisze powiedzmy required albo
jeśli wpiszę na przykład zbyt krótką not to short
to ten komunikat nam
się tu nie pojawi bo powien się pojawić pod tą treścią po pierwsze
nic się nie dzieje a po drugie to miejsce jest zajęte co z tym robić pierwsza
rzecz żeby ten mat error wykrył komunikat błędu to faktycznie
musi być tutaj przypięty jakiś na przykład obsługę formularza teraz mamy
dwie możliwości możemy użyć modułu angular fonts
module lub reactive forms module i ja teraz zacznę od
opcji prostszej czyli ng model ng model oczywiście
tutaj nie zadziała bo nie mamy dodanego modułu czyli
ten ng moduł tutaj niczego nie zmienił spróbuję więc tu do naszych app module
dodać odpowiedni module będzie to forms module
zaimportowany z angular forms tym razem czyli jest to wbudowany model
ng model wbudowany w angulara i
teraz ng model powinien dodać tu walidację jakie
żadne bo nie skonfigurowaliśmy więc dodamy sobie jeszcze tutaj powiedzmy
required i powiedzmy że min length
trzy znaki muszą być mininum i
w tej sytuacji tutaj wygląda to że nic się nie zmieniło ale pierwsza rzecz
jeżeli dodaje tutaj atrybut required material zwróć uwagę automatycznie dodaję nam tutaj gwiazdkę
informacje tutaj wypełnij to pole czy jest to informacja
że pole jest wymagane i
teraz błędu nie widać dopiero jak zacznę pisać lub
opuszczę pole to mamy tu informacje short
description not too short i zwróć uwagę że ten komunikat
błędu zastąpił nam informację która tu była cały czas przy tym hint mamy
tylko jedno miejsce więc automatycznie jeśli jest kontrolka w
stanie błędnym no to te błędy które tu wyświetlamy zastępują ten
komunikat te komunikaty które tutaj by się znajdowały jeśli zrobię align end
hint jest po tej stronie jeśli jest błąd jak
widzisz nawet po prawej stronie i może by się zmieścił tutaj żeby nie
ryzykować że tekst jeden i drugi się jakoś skolidują ze sobą po prostu
te informacje ukrywamy komunikat błędu jest ważniejszy tak
ma priorytet nad wszelkimi tutaj dodatkowymi informacjami okej
w takim razie co się stanie kiedy będzie tutaj kilka
komunikatów błędów to za chwilkę co jeśli mamy tutaj kilka walidacji
skąd wiemy która dotyczy no tutaj musielibyśmy faktycznie zastosować standardową
walidacji angularową czyli w przypadku ng jest to trochę
zawiła sprawa musiałbym się dostać do tego ng modelu nazwę to sobie
powiedzmy description albo title
nazwa jest tu dowolna i do tego przepisze ng
model i teraz mogę dostać do ng
model i pobrać sobie informacje o błędach czyli powiedzmy chcę wyświetlić
no tu short kiedy jeśli w modelu
mamy błąd i podaje tutaj nazwę błędu którego to dotyczy
czyli tu short dotyczy min length requeired
tu będzie required
tutaj jeszcze zmienę na start żeby się to tym samym miejscu
pojawiało okej keep it short komunikaty się nie wyświetlają dopóki
nie wejdę w interakcje z polem mamy gwiazdkę mamy tutaj komunikat
keep it short jeśli tutaj kliknij nic się nie dzieje mogę pisać jeśli
pominę to pole zapomnę go wypełnić przejdę do type to jak
tylko kliknę kolejny element tutaj pojawił nam się field jest required zniknęła
informacja jest to pierwszy komunikat błędu i zacznę pisać automatycznie
tutaj zmienia nam się walidacja pojawia nam się tutaj
inny komunikat i jeśli ten ta gwiazdka nam
się nie podoba nie chcemy gwiazdki to możemy tutaj na
mat form field dodać taką opcję jak hide hide
required marker i tu powinno nam tak
nie wyświetlać tej gwiazdki jest jednak fajna rzecz bo to nam pokazuje które pola
są wymagane praktycznie automatycznie w gratisie tutaj jest jeszcze
jedna kwestia co jeśli jednocześnie dwie walidacje
nam są aktywne czyli mamy dwa błędy popełnione jednocześnie jakby
to zrobić mamy required i length zwróćmy uwagę że pole może być wymagane
i mieć minimalna długość i jeśli ja mam nie wpisane
nic mam tylko jeden komunikat błędu ale to nie dlatego że
on wyświetla jednocześnie jeden on tutaj wyświetla wszystkie które może tak
się składa że pole mogłobyć wymagane albo powiedzmy pole ma wymaganą
długość ale nie jest wymagane czyli mogę zrobić w ten sposób i
w ten sposób jeśli nic nie wpisze jest to poprawne dopiero jeśli mamy requeired i min length to
jest niepoprawne i teraz powiedzmy że dodam tu jeszcze jedną walidację pattern
wzorzec i
powiedzmy że pole musi mieć musi
zaczynać się od litery nie wiem
może od znaku zaczynać powiedzmy od a z spróbujmy
coś takiego i dodam tutaj jeszcze jedną walidację nazywę ją pattern i
powiem że musi zaczynać się od litery
okej i teraz tak jeśli wpiszę jedynkę zwróć uwagę
tu mamy dwa błędy jeśli są dwa błędy jeszcze nie ma tragedii ale
zobacz one tu zaczynają nachodzić na kolejny element tu za bardzo jest to bardzo blisko gdyby
miał trzy cztery więcej błędów to pojawi się taki problem że te błędy
zaczną tutaj nachodzić na kolejne pole i teraz co możemy z tym zrobić
moglibyśmy tutaj dodatkowo jeszcze warunki sprawdzać czyli powiedzmy jeśli
min length tak ale
nie na przykład pattern lub odwrotnie tutaj jeśli
pattern ale nie min length tylko te if'y będą się bardzo skomplikowane stały alternatywą jest
po prostu ukryć css'em elementy których nie potrzebujemy tutaj
mat error element ja sobie go zbadam jest
to mat error jeśli chcemy tylko jeden z nich tu się kilka wyświetli
bardzo prosta sprawa poszukam sobie mat error okej
i jeśli jest ich kilka to mogę mieć na przykład
last child albo first child i
mógłbym ukryć ostatni element nawet jak będzie ich więcej 3 4 5 no
to mogę powiedzmy wszystkie które nie są
ostatnim elementem ukryć
spróbujmy display
none i teraz jeśli pojawi się ich kilka on ukryje wszystkie
poza ostatnim czyli
spróbuję jeszcze raz nie ma błędu napiszę jedynkę kliknę obok
musi zaczynać się literą wcisnę a
nie za krótki czyli widzisz w ten sposób można tutaj
zamiast pisać logikę jakąś skomplikowaną w angularze w htmlu możemy
po prostu ukryć css'em nadmiar błędów tak by wyświetlić pierwszy lub ostatni
mógłbym zmienić także na first child jeśli chciałbym jeśli chciałbym żeby zawsze
pierwszy z listy naszej się wyświetlał oczywiście kolejność zależy tutaj od tego w
jakiej kolejności umieścicie umieścisz te elementy tutaj w htmlu
i jak pewnie zwróciłeś uwagę tutaj w tym naszym formularzu
te błędy nie pojawiają się od razu jeśli ja umieszczę kursor błędów
nie widać jeśli zaczniemy pisać to już błędów nie
widać dopiero jak opuszczę to pole lub spróbuję wysłać formularz
dopiero wtedy pojawia mi się komunikat błędu jest to bardzo praktyczne
zachowanie bardzo dobry sposób działania formularza bo nie przeszkadza
nam w trakcie pisania dopiero jak opuszczę przejdę do kolejnego to mówi cofnij
się tam jest błąd popełniłeś błąd cofnie się jednak tutaj zależnie od
projektu zależnie od sytuacji możemy potrzebować troszkę innego zachowania gdybym
na przykład chciał taką sytuację że na początku nie ma błędu ale
dopiero jak już zacznę pisać powiedzmy wpiszę
tu jakąś długą nazwę zaczyna od nad przykład
od 1 2 3 to no fajnie
by już wiedział że to jest to błąd a nie dopiero jak skończę pisać no to dopiero
wtedy co można z tym zrobić możemy definiować w inny sposób pokazywania
i chowania tych błędów i tego nie będziemy robić tutaj w htmlu tylko zrobimy
to po stronie javascriptu ja stworzę specjalną klasę to
sobie usunę i będzie to mój własny
nazwę go custom error matcher
error state matcher i będzie
to klasa która będzie rozszerzała domyślny error state matcher właśnie
implementowała i teraz
tą klasę zaimportujemy sobie z angular-material powinno
tak zadziałać i tutaj brakuje jakiejś metody tu mi podświetla błąd tutaj w edytorze
jeśli masz taką funkcję powinna być taka funkcja jak automatycznie zaimplementuj
interfejs i ono mi w taki dziwny sposób
to robi bo robi to inline'owo ale nie szkodzi pousuwam to
i te importy teraz każe mu zaimportować może jeszcze raz czyli
także żarówka dodaj brakujące importy okej
czyli jak widzisz custom error state matcher czy w ogóle
error state matcher jest to funkcja która zmieni zachowanie pod wyświetlanie błędów pokazywania
błędów i to jest klasa która musi implementować funkcje is error czyli czy
mamy błąd dostajemy tutaj kontrolkę aktualną ogniu której to przetniemy także
cały formularz i musimy zwrócić prawda lub fałsz i
teraz tak jeśli powiedzmy return albo
może w ten sposób napiszemy jeśli mam kontrolkę okej
i jeśli ta kontrolka no
właśnie invalid jeśli ma jakiś błąd niekoniecznie nie mówi jaki błąd nie chce sprawdzać
jaki to jakikolwiek błąd się pojawił no
właśnie ale czy to wszystko może napisze to w jednym if'ie żeby było szybciej żeby tych
if'ów nie zagnieżdżać czyli jeśli istnieje kontrolka jeśli jest w niej błąd
i właściwie moglibyśmy już to od razu zrobić tylko to w ten sposób
od razu cały czas będzie nam się świeciło na czerwono to może zróbmy tak
że jeśli jest kontrolka jeśli jest niepoprawna i
jeśli ktoś zaczął pisać czyli
zmienił stan na brudny ze stanu czystego lub
ktoś
opuścił to pole czyli dotknął i poszedł do kolejnego pola czyli
tu mamy dwie sytuacje mogę to sobie w nawiasie także zapisać żeby było
czytelniej czyli jeśli mamy kontrolkę jeśli jest błędna
nie wyświetla im błędu dopiero jeśli ktoś zacznie edytować lub
ktoś pominie w sensie wejdzie i wyjdzie zapomnie o tej kontrolce to żeby wrócił i
jeszcze mamy zobacz dostęp do całego formularza więc możemy sprawdzić czy
ktoś w ogóle nie pominą tej kontrolki i nie poszedł od razu do formularza
i go nie próbował wysłać w każdej z tych sytuacji zwracam
tak czyli wyświetl błąd mógłbym
właściwie od razu zamiast if'a zwrócić to
wszystko bo całe to wyrażenie będzie też albo prawdą albo fałszem też
jest to poprawne więc zobaczmy tutaj możemy podjąć decyzję kiedy
który stan formularza i kontrolki oznacza że wyświetlamy
błąd teraz ten custom error state matcher to
jest klasa ja muszę utworzyć konkretny obiekt więc tutaj dodam
sobie error matcher i
utworzy sobie nową taką klasę mógłbym poprzez dependency
injection wstrzykiwać do konstruktora ale tutaj dla uproszczenia po prostu
utworzę sobie bezpośrednio w tym miejscu i teraz tak przechodząc do formularza
error matcher
to się równa error matcher i to jest nie tutaj tylko na
inpucie okej zobaczmy teraz coś
tu jeszcze jest nie tak error state matcher oczywiście
okej i teraz nim wyświetli tutaj błędy powinien
się skonsultować z naszym obiektem error matcher i dopiero wtedy podjąć decyzję czy
te wszystkie flagi te wszystkie statusy są prawdziwe dopiero wtedy wyświetlić błąd
okej coś tu jeszcze jest nie tak submitted
of null no tak nie mamy formularza zwróć uwagę że
jeśli chcesz skorzystać z takiej walidacji mamy jeden input nie jest on częścią formularza
żeby to zadziałało to musiałbym to wszystko objąć jeszcze w formularz
dodam sobie tak formularz i muszę
obtoczyć wszystkie kontrolki w formularz tak żeby
ta kontrolka nasza input wiedziała z którym przyciskiem
tutaj ma się skomunikować i nasz create task to będzie submit
czyli żeby było wiadomo które kontrolki
dotyczą którego pola i tutaj oczywiście będzie problem prawdopodobnie oczywiście że
jeśli mamy kilka pól w formularzu to musimy je nazwać bo inaczej nie będzie wiadomo które pole jest które czyli
jak mamy to pole z ng model to musiałbym jeszcze dodać tutaj jakiś name
i to jest powiedzmy title
tytuł naszego zgłoszenia tytuł naszego zadania okej
tu coś się popsuło ze stylami z jakiegoś powodu prawdopodobnie
chodzi o formularz tak jeśli chcemy żeby była flex box w kolumnie to formularz
umieszczę na zewnątrz a div'y ze stylami umieszczę
w środku teraz powinny się style zgadzać okej
teraz mamy formularz dzięki temu że formularz obejmuje i input
i button kliknięcie w button powiadomi że tutaj matcher o tym
że ktoś próbował wysłać formularz czyli tak nic nie piszę nic się nie dzieje kliknę
nic się nie dzieje ale zacznę pisać od razu tym razem widzę komunikat
błędu tak nie muszę tak opuścić pola
że nie muszę skończyć pisać tylko już w trakcie pisania druga
opcja jeśli nie
zacząłem pisać może w ogóle właśnie nie będę nawet dotykał formularza
tylko od razu kliknę wyślij jak widzisz także kliknięcie w
przycisk powiadamia formularz że został wysłany próba wysłania co
z kolei powiadomiło nasz tutaj error matcher o tym że należy wszystkie
błędy tutaj wyświetlić w tym formularzu czyli nie pozwalamy komuś wysłać nie
uzupełnionego formularza i to tyle jeśli chodzi o tutaj walidacje
z angular material jak widzisz jest to bardzo przyjemne bardzo wygodne jest też dużo
możliwości konfiguracji jak pokazałam tutaj wersję z
ng model i angular forms module
ale tak samo tutaj zadziałałoby to z reactive
forms module tych wszystkich po prostu tutaj elementów
byśmy nie potrzebowali tylko moglibyśmy schować sobie to w javascripcie
użyć form control group home control czyli standardowy formularz reaktywny
w angularze tak że będzie to ładnie nam współgrało z angular material
i z walidacją to tyle do zobaczenia
w kolejnych lekcjach