Miałem wrażenie, że Angular przepisze adresy URL pojawiające się w atrybutach href tagów zakotwiczenia w temaltalach, tak aby działały zarówno w trybie HTML5, jak i Hashbang. Dokumentacja za usługę lokalizacji zdaje się mówić, że HTML Link Przepisywanie dba o sytuacji hashbang. Spodziewałbym się zatem, że gdy nie będzie w trybie HTML5, skróty zostaną wstawione, aw trybie HTML5 nie.
Wydaje się jednak, że przepisywanie nie ma miejsca. Poniższy przykład nie pozwala mi po prostu zmienić trybu. Wszystkie linki w aplikacji będą musiały zostać przepisane ręcznie (lub uzyskane ze zmiennej w czasie wykonywania. Czy muszę ręcznie przepisać wszystkie adresy URL w zależności od trybu?
Nie widzę żadnego przepisywania adresów URL po stronie klienta w Angular 1.0.6, 1.1.4 lub 1.1.3. Wydaje się, że wszystkie wartości href muszą być poprzedzone znakiem # / dla trybu hashbang i / dla trybu html5.
Czy konieczna jest konfiguracja, aby spowodować przepisywanie? Czy źle czytam dokumenty? Robisz coś głupiego?
Oto mały przykład:
<head>
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.1.3/angular.js"></script>
</head>
<body>
<div ng-view></div>
<script>
angular.module('sample', [])
.config(
['$routeProvider', '$locationProvider',
function ($routeProvider, $locationProvider) {
//commenting out this line (switching to hashbang mode) breaks the app
//-- unless # is added to the templates
$locationProvider.html5Mode(true);
$routeProvider.when('/', {
template: 'this is home. go to <a href="https://stackoverflow.com/about"/>about</a>'
});
$routeProvider.when('/about', {
template: 'this is about. go to <a href="https://stackoverflow.com/"/>home</a'
});
}
])
.run();
</script>
</body>
Dodatek: czytając ponownie moje pytanie, widzę, że użyłem terminu „przepisywanie” bez dużej jasności co do tego, kto i kiedy chciałbym dokonać przepisania. Pytanie dotyczy tego, w jaki sposób zmusić program Angular do przepisania adresów URL podczas renderowania ścieżek oraz w jaki sposób zmusić go do interpretacji ścieżek w kodzie JS w sposób jednolity w obu trybach. To nie o tym, jak spowodować, że serwer WWW, aby zrobić HTML5 zgodny przepisywanie wniosków.
źródło
Odpowiedzi:
Dokumentacja nie jest bardzo jasna na temat routingu AngularJS. Mówi o trybie Hashbang i HTML5. W rzeczywistości routing AngularJS działa w trzech trybach:
Dla każdego trybu istnieje odpowiednia klasa LocationUrl (LocationHashbangUrl, LocationUrl i LocationHashbangInHTML5Url).
Aby zasymulować przepisywanie adresów URL, musisz ustawić wartość html5mode na true i udekorować klasę $ sniffer w następujący sposób:
Wyjaśnię to teraz bardziej szczegółowo:
Tryb Hashbang
Konfiguracja:
Dzieje się tak, gdy trzeba używać adresów URL z skrótami w plikach HTML, takich jak
W przeglądarce musisz użyć następującego linku:
http://www.example.com/base/index.html#!/base/path
Jak widać w czystym trybie Hashbang, wszystkie linki w plikach HTML muszą zaczynać się od podstawy, np. „Index.html #!”.
Tryb HTML5
Konfiguracja:
Powinieneś ustawić bazę w pliku HTML
W tym trybie możesz używać linków bez # w plikach HTML
Link w przeglądarce:
Hashbang w trybie HTML5
Ten tryb jest aktywowany, gdy faktycznie używamy trybu HTML5, ale w niekompatybilnej przeglądarce. Możemy symulować ten tryb w kompatybilnej przeglądarce, dekorując usługę $ sniffer i ustawiając historię na false.
Konfiguracja:
Ustaw bazę w pliku HTML:
W takim przypadku łącza można również zapisać bez skrótu w pliku HTML
Link w przeglądarce:
źródło
$provide
jest niezdefiniowany?Przyszli czytelnicy przyszłości, jeśli używasz Angulara 1.6 , musisz również zmienić
hashPrefix
:Nie zapomnij ustawić bazy w swoim HTML
<head>
:Więcej informacji o dzienniku zmian here.
źródło
Zajęło mi to trochę czasu, żeby to rozgryźć, więc tak to działa - Angular WebAPI ASP Routing bez # dla SEO
Dodaj $ locationProvider.html5Mode (prawda); do app.config
Potrzebowałem pewnego kontrolera (który był w kontrolerze domowym), aby go zignorować podczas przesyłania obrazów, więc dodałem tę regułę do RouteConfig
W Global.asax dodaj następujące elementy - pamiętaj, aby zignorować api i ścieżki przesyłania obrazów, aby działały normalnie, w przeciwnym razie przekieruj wszystko inne.
Upewnij się, że używasz $ location.url ('/ XXX'), a nie window.location ... do przekierowania
Odwołaj się do plików CSS z bezwzględną ścieżką
i nie
Ostatnia uwaga - zrobienie tego w ten sposób dało mi pełną kontrolę i nie musiałem nic robić z konfiguracją sieci.
Mam nadzieję, że to pomaga, ponieważ zajęło mi to trochę czasu.
źródło
Chciałem mieć dostęp do mojej aplikacji w trybie HTML5 i stałym tokenie, a następnie przejść do metody hashbang (aby zatrzymać token, aby użytkownik mógł odświeżyć swoją stronę).
URL dostępu do mojej aplikacji:
http://myapp.com/amazing_url?token=super_token
Następnie, gdy użytkownik ładuje stronę:
http://myapp.com/amazing_url?token=super_token#/amazing_url
Następnie, gdy użytkownik nawiguje:
http://myapp.com/amazing_url?token=super_token#/another_url
Dzięki temu trzymam token w adresie URL i utrzymuję stan, gdy użytkownik przegląda. Straciłem trochę widoczność adresu URL, ale nie ma idealnego sposobu na zrobienie tego.
Więc nie włączaj trybu HTML5, a następnie dodaj ten kontroler:
źródło