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 zajmiemy się nawigacją
główną strony a właściwie to nawigacją boczną taką którą będzie
można schować lub dostosować zależnie od tego jaki rodzaj ekranu jaki rodzaj
urządzenia akurat mamy tutaj moglibyśmy stworzyć
wszystkie komponenty ręcznie znowu napisać cały kod ale mamy tutaj także
te gotowe schematics czyli gotowe schematy narzędzia
generujące więc może być ng generate zamiast
którychś z wbudowanych elementów mogę użyć angular material
i zobaczyć jakie tutaj gotowe schematy
mamy dostępne zobaczymy czy mi się lista pojawi okej
czy oprócz wybudowanych domyślnych mamy specjalne tutaj dostarczone przez angular material
generatory mamy formularz tutaj dashboard i między innymi mamy tutaj nawigację
ja spróbuję teraz wykorzystać ten wbudowany generator nawigacji do
stworzenia sobie tutaj material examples
czyli analogiczne byśmy generowali po prostu zwykłe komponenty
pages i nazwę może main
main navigation w ten sposób
powinno mi to wygenerować komponent który będzie miał już zawarte
komponenty takiej właśnie bocznej nawigacji zobaczymy jak
to wygląda tutaj powininno mi podać odpowiednie moduły
czyli pojawił się tutaj layout module i side nav
module automatycznie nie musiałam tego robić pojawi się komponent tutaj main navigation
ja ten komponent dodam tutaj gdzieś do routingu
tutaj zrobimy sobie examples i utworzyłem
nową ścieżkę która pozwoli tutaj na czysto zacząć path
pusta ścieżka i komponentem będzie właśnie nasz main navigation
menu navigation component main navigation
component jak sobie zobaczymy w środku pierwsze obserwuje tutaj breakpointy to co
robiliśmy wcześniej sprawdzamy czy mamy urządzenie mobilne czy desktop
no i jeśli jest mobilne tutaj zwracamy matches i tutaj
powinniśmy mieć true false po prostu czy jest to urządzenie handset czyli
urządzenie mobilne i teraz tak w htmlu sobie zobaczymy
jest tu trochę komponentów ja to spróbuję troszeczkę rozpakować
to tak mamy tej kontener który zawiera szufladę boczną
i content czy główną treść tutaj znajduje się szuflada
po polsku mówiąc szuflada po prostu drawer i
tutaj znajduje się główny content główna treść w którym znajduje się toolbar
czyli główny pasek z aplikacji i tu
jest nazwa naszej aplikacji może
niech będzie tak menu zobaczymy jak to wygląda
jak otworzę aplikację powinniśmy zobaczyć nasz projects
i z boku takie menu to menu tu jest na sztywno
zamontowane jak sobie zobaczymy jest to tutaj tryb
over albo side i oba te tryby zmieniają
się zależnie od tego jaki mamy tryb handset czy mobilny czy
desktopowy plus tu mamy jeszcze parametr opened czyli powinno nam się zamknąć
to menu jeśli tryb tutaj też się zmieni
zobaczymy co się stanie jak ja spróbuję zwęzić ekran spójrz
automatycznie jak tylko ten ekran przekroczy pewien próg czyli jest to tablet
lub telefon poziomy to to manu się automatycznie przeskakuje
tu jest w trybie w takim który jest on zawsze na wierzchu nie możemy go schować natomiast
jak tylko ekran jest zbyt mały to menu mi się też automatycznie schowa
domyślnie to pojawia się przycisk który pozwala nam to menu wyświetlić
tutaj przycisku zamykania nie ma pojawia się tak zwane tutaj backdrop
czyli cień który działa jak przycisk zamykania jeśli kliknę
poza menu czyli kliknę gdzieś na tym cieniu to ten dzień po pierwsze blokuje akcje
czyli jeśli byłyby przyciski pod spodem one nie działają klikając w cień po prostu
kliknięcie w cień zamknie nam to menu zwróci nam z powrotem bardzo fajny mechanizm
i tutaj poniżej pod tymi nagłówkami
mamy sidebar content jest to specjalny tag który wyświetli tą główną
zawartość razem z nagłówkiem i pod nagłówkiem możemy go dodać
możemy go usunąć tutaj umieszczamy treść mógłbym tutaj dać
statyczną treść chcę zrobić to dynamicznie więc zrobimy tutaj router outlet
abym mógł po prostu tutaj dynamicznie
dodawać ścieżki w których jesteśmy czyli powiedzmy że w naszym
menu będziemy mieli kilka różnych opcji będziemy mieli na przykład kontakty
będziemy mieli powiedzmy projekty mielibyśmy projekty i
zadania kilka różnych opcji
do wyboru i tak jak wejdę w któryś z tych adresów no to żeby tutaj ten router outlet nam
się zmieniał przy routingu możemy zamiast href użyć
router link i odpowiednio tutaj
przekierować się na właściwy adres czy będzie to
kontakty projekty albo zadania do małych
literek i dojdę tutaj sobie do routingu dodam te też
trzy ścieżki tutaj jako pod komponenty tak
children i w każdej z tych ścieżek zrobimy
z tego 3 osobne adresy
tak które można sobie wybrać czyli będzie to ścieżka tak ścieżka
do komponentu i komponentem będą
tutaj analogicznie contacts
component projects component
i teraz komponent który pozwoli nam sobie utworzyć tutaj przed chwilką trzy
komponenty każdy w osobnej ścieżce i children powinien oczywiście być
tablicą a nie obiektem czyli jak wejdę w te elementy no to te komponenty
powinny się pojawić wewnątrz tej nawigacji powinny
się załadować w tym środkowym oknie jako dziecko czyli jak wejdę w kontaktach
contacts projects tasks możemy się przełączyć
pomiędzy tymi elementami okej i
teraz będąc w których z tych elementów na przykład w projektach albo w
zadaniach powiedzmy sobie że przyjdę do pages tutaj
do projektów projekty albo
zadania tu no to znowu utworzę sobie też taką nawigację ja
sobie to jej przekopuje przykładowy taki
kod nawigacji tu
ustawię wysokość tutaj 1 zobaczymy czy to zadziała żeby dać
jeszcze jedno menu zagnieżdżone czyli jak jestem w projektach to chciałbym żeby projekty
miały jeszcze swoje menu ale widzę że coś tu nie działa prawdopodobnie to menu
nie ma wysokości zobaczmy tutaj mamy content project
works projects coś to jeszcze poszło nie tak tasks
to miało być o przepraszam czyli tak to sobie umieścimy tu zrobimy
ponownie mat content
dodamy sobie zadania i zobaczymy czy
to nam się tutaj pojawi zadania okej
tu są zadania i tutaj widzisz pojawiły się menu z prawej strony dlatego że pozwoliłem
sobie tutaj dodać tryb opened żeby zawsze było otwarte klasa
sitenav której tutaj chciałbym dodać szerokość tu znowu brzydko
w tym samym pliku żebyś ładnie widział wiedziała o co chodzi ustawię
tutaj wysokość może szerokość najpierw też
powiedzmy z 200 pikseli jeżeli chodzi o szerokość to jest możliwość
tutaj napraw wysokość napraw dziurę w fixed top fixed bottom
żeby się przykleiło do góry do dołu jednak żeby to działało to sam kontener czyli komponent
w którym jesteśmy powinien mieć też odpowiednią wysokość a jak widzisz cały komponent tutaj
nasz tasks niestety jest troszeczkę za
niski więc cały ten taska musiałbyś mieć też jakąś sensowną wysokość
nie pomaga display block
lepiej teraz kontener nie ma odpowiedniej wysokości więc trzeba uważać
tutaj na odpowiednie wysokości gdyby ten app task miał nie display block
tylko display może flex o to elegancko ta wysokość w której
się zgadza a nawet jest to trochę za dużo więc można byłoby tutaj
popracować z tymi wysokościami żeby na przykład to było 100%
powiedzmy odjąć 80 pikseli
na ten pasek u góry coś
takiego lub cały rodzic żeby też był flex jak widzisz z layoutem
trzeba samemu widzisz dopasować żeby dziury nie było poradzić sobie z
tymi odpowiednimi odstępami wysokościami jeśli tutaj jest okej no to
to menu nam się będzie tutaj elegancko pojawiało z prawej lub
z lewej strony możemy open close je zamykać otwierać możemy na tej
po zagnieżdżać jak widzisz na każdym poziomie możemy mieć dodatkowe takie poboczne menu
on też jest chowany zwijany tak to główne dobra to
ja sobie tutaj jakoś to spróbuję z tymi stylami poradzić czyli
host czyli komponent w którym jesteśmy ustawmy mu też na
flex powiedzmy 1 a
poziom wyżej tam gdzie mamy ten main navigation niech cały
content powiedzmy niech będzie display
flex i flex direction
column żeby te komponenty nam się w pionie miały wysokość
100% zobaczmy czy to pomoże jeszcze
nie tu teraz ten komponent tasks powinien
mieć jeszcze swoją własną flex
1 i container także powiniene mieć tutaj wysokość
flex 1 czyli to też display flex
o i mamy tutaj okno które się nie przewija próbuję przewijać
to nie działa przy oknie cały czas będzie otwarte trzeba by zastanowić
się czy tego też nie chcemy zwinąć przy małym ekranie przy dużym ekranie nam się to
to elegancko zadziała no i takie menu można wstawiać po obu
stronach tak może być to position and może być to position start i jeśli
chcemy to menu możemy także umieścić tutaj z drugiej strony ekranu
one się mieści z tej strony treść będzie po drugiej możemy
też dynamicznie zmieniać tutaj tą pozycję żeby
przykleić do góry do ekranu i żeby kontenery po prostu to i sam
komponent żeby miał odpowiednią wysokość szerokość żeby to menu pomieścić
okej czyli powiedzmy tu jeszcze w kontaktach zrobimy sobie podobnie
też umieszczę sobie taką strukturę w
komponencie contacts tutaj ustawię to
jako ukryte i spróbujemy tutaj wykorzystać
któryś z poprzednich komponentów aby wyświetlić powiedzmy listę kontaktów
nad którą pracowaliśmy nad którą pracowaliśmy wcześniej tutaj gdzieś w list example
pobiorę sobie kod który ładuję nam kontakty tutaj mamy jakiś
też contacts service podobnie jak user service to
sobie pożyczę z tego istniejącego komponentu i tego nowego komponentu
kontaktów dodam ten kod import
przesuniemy do góry tak żeby zobaczyć jak ta nawigacja tutaj poradzi
sobie jak ona będzie wyglądała razem z przykładowym treścią żebyśmy mieli pustego pustego
ekranu okej mam tutaj kontakty załadowane synchronicznie tym
razem czyli tam nie ma tutaj observable moglibyśmy to zamienić ale
żeby już nie komplikować tutaj postaram się który z tych komponentów
wcześnie użyć czyli powiedz app który
tu mamy contact selection list czyli
zaznaczona lista kontaktów przekażemy tutaj nasze kontakty
tak czyli ten komponent z tego
co pamiętam on tutaj posiadał ładnie input contacts
super i tu przekazujemy nasz contacts będziemy
także nasłuchiwać na zdarzeniach czyli powiedzmy jak tu jest selection
change zdarzenie chciałam wiedzieć czy któryś z kontaktów
został zaznaczony powiedzmy
w ten sposób dobra zobaczymy jak to się będzie prezentowało
przejdziemy sobie w kontakty i mamy tutaj listę kontaktów jeśli
kliknę któryś z elementów kliknę wybiorę któryś no
to mam tutaj informację że jest selected więc możemy to menu boczne które tu mamy
dopasować do opcji selected żeby ono pojawiło nam się w momencie kiedy któryś z
tych elementów jest wybrane czyli główne menu jest otwarte nam cały czas
ale się kliknę któryś z elementów to nam tutaj ładnie
animuje się ten element możemy też zobaczyć coś takiego
że jeśli coś
już jest zaznaczone na to żeby to na przykład odznaczyć czyli
spróbujemy toggle jeśli
ktoś kliknie czyli ustawmy żeby this selected żeby
tylko i wyłącznie się zmieniał kiedy już nie jest zaznaczone czyli jeśli
user już
jest zaznaczony to ustawmy powiedzmy null a
jak nie to user powinno nam to odznaczać
te elementy czyli będę mógł teraz sobie wejść zaznaczyć
element coś nie poszło toggle
selection nie jest funkcją coś się nie zapisało toggle selection
selection oczywiście 2 g toggle selection
i tu jest też toggle selection zobaczymy
czyli to zmiana powinna mi elegancko animować to menu i odznaczenie
z portem powinno je schować no i wtedy szczegóły takiego jednego zaznaczonego elementu
czy mam już od contact details który wcześniej stworzyliśmy
który przyjmuje jeden kontakt to moglibyśmy tutaj sobie w ten menu
boczne umieścić app contact
details list i
tu przekazać kontakt który jest właśnie
zaznaczony czyli trzeba zrobić jeszcze ng if selected
tutaj wybieramy pojawiają się szczegóły to jest trochę dość dość takie
wąskie żeby poszerzyć ten to menu boczne wybieramy
pojawiają nam się szczegóły wybranego użytkownika
zwijamy znikają przełączając
na inne osoby będą się tutaj zmieniały szczegóły czyli to menu boczne może służyć zarówno
do głównej nawigacji gdzie przełączamy się pomiędzy projektami
zdaniami pomiędzy głównymi ekranami ale także może służyć jako tutaj
dodatkowe podmenu które pojawia nam się przy
wyborze jakieś podstrony okej czyli
jak widzisz możesz sobie skonstruować taki kontener kilka
menu po prawej po lewej możesz zmienić mode można
dostosować też różne tryby żeby właśnie na urządzeniach mobilnych powiedzmy żeby to nam
przykrywało ekran na urządzeniach desktop to
menu może być cały czas dostępne lub pojawiać się na przykład dopiero jeśli klikniemy wybierzemy
taką opcję okej to tyle jeśli chodzi o nawigację
boczną do zobaczenia w kolejnych lekcjach