Я использовал "стандартные" маршруты в Angular 1, которые используют знак #
(например, /app#/home
). Теперь я хотел бы переключиться на режим HTML5, чтобы иметь красивые URL-адреса (например: /app/home
).
Я переключил режим HTML5 с помощью $locationProvider.html5Mode(true)
и все работает должным образом.
Тем не менее, некоторые из наших пользователей могут по-прежнему иметь закладки и ссылки по электронной почте, которые имеют старый формат URL, и те могут сломаться. Я хотел бы, чтобы старые URL-адреса все еще работали (у вас /app#/home
redirect to /app/home
автоматически).
Я пробовал использовать маршрут по умолчанию, который выглядит так:
$routeProvider
.when({ ... })
.otherwise({
'controller': function($location) {
var hash = $location.hash();
// At this point the hash is undefined (even when there is one in the URL)
console.log('hash = ' + hash);
// if (hash && hash.indexOf('/') == 0) {
// $location.path(hash);
// } else {
// $location.path('/home')
// }
}
});
Это, к сожалению, не сработало (контроллер не видит, что хеш и Angular, похоже, входят в бесконечный цикл дайджеста).
Любая идея о том, как этого достичь?
Используйте $ routeChangeStart:
angular.module('routing', ['ngRoute'])
.run(['$rootScope', '$location', '$window', function($rootScope, $location, $window) {
$rootScope.$on("$routeChangeStart",
(event, current, previous, rejection) => {
if (/#\//.test($window.location.hash)) {
$location.path($window.location.hash.replace('#', ''));
}
});
...
else
? Если нет хэша, разве вы уже не там, где хотите?