Czym jest routeProvider?
Użycie routeProvider w Angular 1 umożliwia przeniesienie routingu z warstwy backendowej do frontendu. Prościej: zmiany w adresie strony internetowej przechwytywane, są przez Angulara i pobierana jest określona część strony zamiast ładowanie całej strony na nowo z serwera. Do użycia routeProvider, potrzebne jest kilka rzeczy:
1) Dołączenie do projektu pliku: angular-route.min.js
np. z CDN google:
< script src="//ajax.googleapis.com /ajax/libs/angularjs /1.4.8/angular-route.js" > < /script>
2) Na naszej stronie/aplikacji należy dodać ng-view
. To właśnie w tym miejscu zostanie na stronę wczytana zawartość, która wskazana będzie w routingu. Najpopularniejszymi metodami dodania, są:
< ng-view > < /ng-view > lub < div ng-view > < /div ng-view >
3) Następnie niezbędne jest wstrzyknięcie ngRoute
w module angulara: angular.module
var app = angular.module('app', ['ngRoute']);
4) Konfiguracja
app.config(['$routeProvider', function($routeProvider){
$routeProvider
.when('/',
{ templateUrl: '/done.html',
controller: 'main'
})
.when('/example',
{ templateUrl: '/example.html',
controller: 'main'
})
.otherwise({
template: 'Brak strony!'
});
}]);
Problemy z routeProvider w Angular 1.6
$locationProvider .hashPrefix
Zgodnie z powyższą konfiguracją powinniśmy w pasku przeglądarki po adresie domeny uzyskać znak # i cały routing czyli kolejne podstrony będą dodawane po nim. Problem jednak pojawia się w przypadku AngularJS 1.6. Okazuje się, że zmiany adresu URL, które powinny pojawiać się po #, w tej wersji Angulara wyglądają w taki sposób #!.
W momencie, gdy spróbujemy przejść na adres #/example
otrzymamy #!#%20example
co powoduje, że całość przestaje działać. Jest jednak ratunek na tą przypadłość. Należy dodać $locationProvider
:
app.config(['$locationProvider', '$routeProvider', function($locationProvider, $routeProvider){
$locationProvider.hashPrefix('');
$routeProvider
.when('/', { //reszta identycznie jak wcześniej
Problem jest załatwiony jednak istnieje jeszcze jeden sposób, żeby poradzić sobie z adresem. Jest nim użycie metody z HTML5 i wogóle pozbycie się # z adresu.
$locationProvider .html5Mode
W celu użycia trybu HTML5 należy wykonać dwie dodatkowe czynności w stosunku do poprzedniego:
1) Na końcu przedstawianej powyżej listy należy dodać $locationProvider .html5Mode(true);
app.config(['$routeProvider', function($routeProvider){
$routeProvider
.when('/',
{ templateUrl: '/done.html',
controller: 'main'
})
.when('/example',
{ templateUrl: '/example.html',
controller: 'main'
})
.otherwise({
template: 'Brak strony!'
});
$locationProvider.html5Mode(true);
}]);
To jeszcze nie koniec ponieważ w pliku głównym index.html musimy poinformować przeglądarkę od jakiej strony ma zaczynać. Poniższy kod umieszczamy na końcu w sekcji HEAD
< base href="/">
Działającą aplikację typu sklep internetowy (wersja demonstracyjna) z opisanym powyżej mechanizmem <base href="/">
można zobaczyć pod adresem: http://sportshop.papoldesign.pl/.