AngularJS – Routing

bugajsky.pl 5 lat temu

W tym wpisie utworzymy po raz pierwszy aplikację SPA (Single Page Application) z wykorzystaniem AngularJS. Będzie to prosta aplikacja, pokazująca jakie możliwości daje nam omawiany framework. Zaczniemy od utworzenia strony głównej naszej aplikacji. Później dodamy nowa podstronę. A na sam koniec utworzymy podstronę odczytującą parametry.

Co to jest routing?

Nim zajmiemy się tworzeniem aplikacji. Chciałbym wyjaśnić do czego służy routing w aplikacjach SPA. Zatem służy on do nawigowania pomiędzy komponentami. Ważne jest, iż dzieje się to bez przeładowywania strony. Właśnie to jest mocą aplikacji SPA.

Żeby zobrazować dokładniej o co chodzi, posłużę się przykładem. Piszemy aplikację, jej główna strona jest pod adresem domena/home. Na głównej stronie mamy link do zakładki Autorzy, gdzie po kliknięciu w ten link zostajemy przeniesieni na domena/autorzy. Przejście z podstrony /home na /autorzy odbywa się bez przeładowywania strony, dzieję się tak, dzięki wykorzystaniu routingu.

Implementacja

Na samym początku musimy pobrać i dodać przy tworzeniu instancji aplikacji dodatkowy moduł, który odpowiada za obsługę tworzenia ścieżek w naszej aplikacji. Wspomniany moduł to ngRoute.

var app = angular.module('app', [ 'ngRoute', ]);

Kolejnym naszym krokiem jest utworzenie pliku konfiguracyjnego app.rout.js. Plik ten będzie przechowywał wszystkie informacje związane dostępnymi ścieżkami w naszej aplikacji.

app.config(function ($routeProvider) { $routeProvider .when('/', { templateUrl: "./home.tpl.html", controller: "homeCtrl" }) .when('/about', { templateUrl: "./about.tpl.html", controller: "aboutCtrl" }) .when('/user/:id', { templateUrl: "./user.tpl.html", controller: "userCtrl" }) .otherwise({ template: '<div><h1>Error</h1></div>' }) });

Używamy metody config(), gdzie w parametrze podajemy anonimową funkcję wstrzykując do niej $routeProvider. Parametr ten zawiera dwie metody when() i otherwise().

when() – odpowiada za załadowanie odpowiedniej strony pod określonym adresem. Przyjmuje dwa parametry: ścieżkę dostępu oraz obiekt konfiguracyjny.

otherwise() – ładuję określoną treść w chwili, kiedy użytkownik wejdzie na ścieżkę niezdefiniowaną w metodzie when(). Przyjmuje tylko jeden parametr, którym jest obiekt konfiguracyjny.

W przedstawionej powyżej konfiguracji dla ścieżki głównej / zostanie załadowany plik home.tpl.html wraz z kontrolerem homeCtrl.
Dla ścieżki /about zostaną załadowane odpowiednio about.tpl.html oraz aboutCtrl.
Ciekawiej robi się przy kolejnej określonej ścieżce. Otóż, gdy chcemy móc ze ścieżki pobrać dane np. id usera, należy w pliku konfiguracyjnym dodać :, a po dwukropku nazwać parametr. /user/:id wyświetli stronę user.tpl.html oraz użyje kontrolera userCltr.

Obiekt konfiguracyjny

Główne adekwatności to:

  • controler – określa funkcję kontrolera lub zarejestrowany kontroler, jeżeli zostanie podana jego nazwa jako łańcuch znaków,
  • template – określa co ma zostać wyświetlone pod daną ścieżką,
  • templateUrl – przyjmuje ścieżkę do pliku html zawierającego kod, który ma zostać wyświetlony pod określonym adresem.

Z pozostałymi adekwatnościami możemy zapoznać się na oficjalnej dokumentacji AngularJS.

Aby routing działał poprawnie, należy na stronie głównej (plik index.html) dodać

<div data-ng-view=""></div>

Po dodaniu dodatkowego modułu oraz skonfigurowaniu ścieżek, pozostaje nam już tylko utworzenie kontrolerów oraz widoków.

Home

home.tpl.html

<div> <h1>{{ name }}</h1> </div>

homeCtrl

app.controller("homeCtrl", function ($scope) { var ctrl = $scope; ctrl.name = "Home"; });

Jak widzimy powyżej, mamy tutaj diva wraz z klasą jumbotron (pochodzi z bootstrapa) oraz znacznik h1, w którym to wyświetlana jest nazwa podstrony zaczerpnięta z kontrolera.

About

about.tpl.html

<div> <h1>{{ name }}</h1> </div>

aboutCtrl

app.controller("aboutCtrl", function ($scope) { var ctrl = $scope; ctrl.name = "About"; });

Jak możemy zobaczyć, zakładka about jest zbudowana w taki sam sposób jak home.

User

user.tpl.html

<div> <h1>User: {{ id }}</h1> </div>

userCtrl

app.controller("userCtrl", function ($scope, $routeParams) { var ctrl = $scope; ctrl.id = $routeParams.id; });

W przypadku usera, pobieramy identyfikator dzięki wstrzykniętego parametru $routeParams. Aby uzyskać dostęp do parametru należy odwołać się w taki sposób $routeParams.nazwa_parametru.

Działanie aplikacji

Podsumowanie

W tym wpisie stworzyliśmy pierwszą aplikację ASP. Która wyświetla różne dane w zależności od zakładki na której w tej chwili jesteśmy. Dodatkowo poznaliśmy sposób w jaki możemy odczytać z pozycji kontrolera parametry zamieszczone w adresie aplikacji. Dzięki temu jesteśmy w stanie teraz napisać rozbudowaną aplikację z wykorzystaniem frameworka AngularJS.

Idź do oryginalnego materiału