AngularJS dla początkujących – Routing w AngularJS

Aplikacje webowe mogą szybko się rozrosnąć podczas tworzenia. Duża ilość danych i skomplikowana logika w kontrolerach powoduje, że może być ciężko wszystko uporządkować. Tutaj do akcji wchodzi routing w AngularJS. Dzięki tej technice, można dzielić widok na mniejsze ‚pod-widoki’. A co za tym idzie, możemy podzielić logikę na łatwe do przełknięcia kawałki.

Dziś kontynuacja mojej serii o Angularze dla początkujących (poprzednie wpisy tu oraz tu). Tym razem pokażę krótki skrypt przedstawiający routing. Skrypt ten nie będzie zawierał specjalnie skomplikowanej logiki 🙂 . Za to na pewno po lekturze tego wpisu będziecie znali podstawy potrzebne do dalszego rozwoju umiejętności programowania z pomocą AngularJS.

routing w angularjs

Jak działa routing?

W dużym uproszczeniu. Dzięki routingowi mamy możliwość wskazania miejsca w widoku aplikacji, którego zawartość będzie dynamiczna. Wskazane przez nas miejsce może, wedle potrzeby użytkownika, wyświetlać różny kod HTML. Przy tym, cała strony nie zostanie przeładowana. Dodatkowym atutem jest to, że zmiany w widoku, zmieniają również adres URL. Jest to rejestrowane przez przeglądarkę co pozwala np. na użycie przycisku cofnij.

Fragmenty HTMLa, które mają pojawiać się w aplikacji dynamicznie przechowywane są w osobnych plikach.

Routing w AngularJS – przykładowy kod

Ta prosta aplikacja ma na celu przedstawienie użytkowniki listy jego postaci z gry RPG. Po kliknięciu na imię postaci wyświetlą się szczegółowe informacje o danej postaci. Przez cały czas w aplikacji widoczny jest link prowadzący z powrotem do listy.

Przykład składa się z trzech plików index.html, charList.html oraz charInfo.html. Kod JS (który normalnie byłby umieszczony w osobnym pliku/plikach, ale to tylko mały przykład) znajduje się wewnątrz index.html.

Pliki charList.html oraz charInfo.html zawierają tylko widok dla Angulara. Są to fragmenty kodu html okraszonego odpowiednimi dyrektywami (atrybuty ng*) oraz interpolacją (podwójne nawiasy klamrowe). Przedstawię cały kod a następnie przejdę do tłumaczenia, co się tutaj dzieje.

Tak jak w poprzednich przykładach z Angularem, aby ten kod zadziałał musi być odpalony na serwerze.

index.html

charList.html

charInfo.html

Większość tego kodu powinna wyglądać znajomo dla tych, którzy czytali moje poprzednie wpisy o AngularJS. Pierwsza rzecz na która należy zwrócić uwagę, to nowy skrypt, który importuje do pliku w sekcji head dokumentu. Chodzi o angular-route.js. Jest to moduł wymagany do pracy z routingiem i należy ściągnąć go osobno ze strony angulara.

Następna rzecz, która jest nowa to zmiana w deklaracji modułu aplikacji. W tablicy zawierającej zależności aplikacji, musimy dodać moduł routowania. Przekazujemy tam po prostu łańcuch znaków o wartości ngRoute.

Kiedy moduł jest już gotowy, należy skonfigurować routowanie. Służy do tego metoda config modułu. Warto dobrze przyjrzeć się jej składni. jako argument przyjmuje ona tablicę zawierającą dwa elementy. Pierwszy to łańcuch znaków równy $routeProvider a drugi to anonimowa funkcja. Co ciekawe funkcja ta jako parametr przyjmuje obiekt o nazwie takiej samej jak wartość wspomnianego łańcucha znaków. Czyli $routeProvider. Obiektu tego używamy wewnątrz funkcji aby zdefiniować zachowanie routingu.

Tutaj znów warto bardzo dobrze przyjrzeć się składni. Na obiekcie $routeProvider wywoływane są metody oddzielone kropkami. Wygląda to podobnie jak chaining w jQuery.

Obiekt $routeProvider wywołuje dwie metody when oraz otherwise. Każde wywołanie when przyjmuje dwa parametry, pierwszy to łańcuch znaków. Łańcuch ten to atrybut href linka w widoku aplikacji. Jeżeli taki link zostanie kliknięty aplikacja wywoła event routowania zdefiniowany w tym when!

A jak zadziała ten event? O tym decyduje zawartość drugiego parametru metody when. Parametr ten to obiekt o dwóch polach templateUrl oraz controller. Po kliknięciu linka wywołującego routing, aplikacja dynamicznie wczyta do widoku zawartość pliku z adresu zdefiniowanego jako wartość pola templateUrl. Ten nowy element będzie miał automatycznie przypisany kontroler, którego nazwa zdefiniowana jest jako wartość pola controller.

Co do metody otherwise, przyjmuje ona tylko jeden parametr. Obiekt taki sam jak w drugim parametrze metody when. Jak łatwo się domyślić po nazwie metody, wywoła ona widok, wtedy gdy href klikniętego w aplikacji linka nie będzie równy żadnym tym zdefiniowanym w metodach when.

Zwrócę uwagę na jeszcze jedną rzecz, która bardzo przydaje się przy routingu. W drugim when obiektu $routeProvider, wartość pierwszego parametru wygląda tak ‚/showCharInfo/:charName’. Dwukropek oznacza dwie rzeczy. Pierwsza to taka, że niezależnie co zostanie wpisane w miejsce po nim. Wywołany zostanie widok przypisany linkowi /showCharInfo. Druga rzecz oznacza, że wartość wpisana w miejsce :charName zostanie przekazana jako wartość do obiektu $routeParams pod kluczem charName.

Obiekt $routeParams możemy następnie wykorzystać w kontrolerach aplikacji. Podobnie jak obiekt $scope musimy go tylko przekazać jako parametr podczas tworzenia kontrolera. Skoro już jestem przy kontrolerach, zaznaczę tylko, że w tym przykładzie wykorzystuje tylko jeden kontroler. W normalnej sytuacji dążylibyśmy do tego aby używać różnych kontrolerów do różnych widoków, w imię zasady, aby rozdzielać logikę pod widoki. To jest jednak tylko przykład, który ma pomóc w zrozumieniu mechanizmów routowania, dlatego chciałem aby był jak najmniej skomplikowany. (W niedalekiej przyszłości napiszę, jako projekt, większą aplikacje, w której która zaprezentuje w użyciu wszystko to co pisze o Angularze.)

Jak widać dalej, w kontrolerze aplikacji jedynie deklaruję $scope dodaje do niego model zdefiniowany wcześniej oraz przypisuję mu pole, które otrzymuje wartość parametru routingu.

Ostatnia rzecz w pliku index.html to dyrektywa w widoku. Div poniżej tytułu oraz linka prowadzącego do widoku pełnej listy, zawiera atrybut ng-view. To znak dla Angulara, że wszystkie widoki importowane przez routing mają znaleźć się tutaj.

I to właściwie wszystko. Można jeszcze przyjrzeć się zawartość plików zawierające „pod-widoki”. Lista postaci jest generowana w taki sposób że każdy z nich jest linkiem prowadzącym do szczegółowego widoku. Sprytnie przekazany parametr, równy imieniu postaci jest potem wykorzystywany przez aby przez scope dotrzeć do informacji na jej temat.

Jako ćwiczenie utrwalające, poleciłbym napisanie własnej aplikacji. Niech to będzie kolekcja danych, pogrupowana w jakiś sposób. Na przykład informacje o rowerach lub książkach jakie posiadamy. Aplikacja powinna posiadać co najmniej dwa widoki, podobnie do tego co przedstawiłem tutaj. Oprócz tego niech użytkownik posiada też możliwość edytowania informacji o elementach kolekcji. Możliwość dodawania nowych oraz usuwania obecnych. Jeśli uda Ci się napisać taką aplikację, gratuluję. Masz już konkretne fundamenty jeśli chodzi o AngularJS. Możesz śmiało wysyłać CV na frontendowca 😉 .

To na pewno nie koniec Angulara na moim blogu. Myślę, że i dla mnie przyszedł teraz czas na napisanie jakieś dużej aplikacji 🙂 Jeżeli chcesz być na bieżąco z tym co tu zamieszczam, zachęcam do polubienia mojej strony na facebooku. Jest ona bardzo często uaktualniana o najświeższe informacje.

Jedno przemyślenie nt. „AngularJS dla początkujących – Routing w AngularJS”

  1. Wielkie podziękowanie za znakomity opis problemu. Bardzo podoba mi się, że w Pana artykule nie ma skrótów myślowych tylko wszystko jest bardzo dokładnie opisane.Dobry język to połowa sukcesu.
    P.S.
    Dzięki temu artykułowi wdrożyłem swój pierwszy routing w oparciu o AngularJS. Dziękuję.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *