Angular: как обрабатывать маршруты в режиме HTML5 и маршруты хэширования?

0

Я использовал "стандартные" маршруты в 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, похоже, входят в бесконечный цикл дайджеста).

Любая идея о том, как этого достичь?

  • 0
    Лучшее решение - проверить, состоит ли местоположение из «#». Если да, то удалите его и перенаправьте на него.
  • 0
    Есть ли какая-то причина для предложения else ? Если нет хэша, разве вы уже не там, где хотите?
Показать ещё 2 комментария

1 ответ

1
Лучший ответ

Используйте $ 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('#', ''));
              }
          });

...
  • 0
    Я попробовал ваше решение, но каким-то образом $ routeChangeError не запускается и код не запускается. Я также попытался поместить тот же код в событие $ routeChangeStart: код выполняется, но $ location.url () возвращает неопределенное значение.
  • 0
    Я смог настроить ваш код, чтобы он работал. Новый код: $ rootScope. $ On ('$ routeChangeStart', function (event, next) {if (/#/.test($window.location.hash)) {$ location.path ($ window.location.hash .replace ('#', ''));}} Если вы обновите свой ответ, я отмечу его как принятый. Спасибо за указатели!
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню