AngularJS: как включить $locationProvider.html5Mode с deeplinking
При включении html5Mode в AngularJS через $locationProvider.html5Mode(true)
навигация, похоже, искажается, когда вы приземляетесь на страницу глубже на сайте.
например:
-
http://www.site.com
когда я перехожу к корню, я могу щелкнуть все ссылки на сайте, Angular $routeProvider
возьмет на себя навигацию по сайту и загрузку правильных представлений.
-
http://www.site.com/news/archive
но когда я перехожу к этому URL (или ударяю обновление, когда я нахожусь на deeplink, как и выше), эта навигация не работает, как я ожидаю.
в первую очередь, как Documentation for $locationProvider.html5Mode, мы улавливаем все URL-адреса на сервере, аналогично маршруту otherwise
в angular и вернуть тот же html, что и корневой домен. Но если я затем проверяю объект $location
из функции run
angular, он сообщает мне, что http://www.site.com
- мой host
, а /archive
- мой path
. $routeProvider
приходит в предложение .otherwise()
, так как у меня есть только /news/archive
как действительный маршрут. и приложение делает странные вещи.
Возможно, переписывание на сервере должно выполняться по-другому или мне нужно указать материал в angular, но в настоящее время я не знаю, почему Angular видеть путь без сегмента /news
.
example main.js:
// Create an application module
var App = angular.module('App', []);
App.config(['$routeProvider', '$locationProvider', function AppConfig($routeProvider, $locationProvider) {
$routeProvider
.when(
'/', {
redirectTo: '/home'
})
.when('/home', {
templateUrl: 'templates/home.html'
})
.when('/login', {
templateUrl: 'templates/login.html'
})
.when('/news', {
templateUrl: 'templates/news.html'
})
.when('/news/archive', {
templateUrl: 'templates/newsarchive.html'
})
// removed other routes ... *snip
.otherwise({
redirectTo: '/home'
}
);
// enable html5Mode for pushstate ('#'-less URLs)
$locationProvider.html5Mode(true);
$locationProvider.hashPrefix('!');
}]);
// Initialize the application
App.run(['$location', function AppRun($location) {
debugger; // -->> here i debug the $location object to see what angular see as URL
}]);
Edit
по запросу, более подробная информация на стороне сервера:
серверная сторона организована путем маршрутизации структуры zend и обрабатывает ее собственные маршруты (для обслуживания данных в интерфейсе на определенных URL-адресах /api
), а в конце есть общий маршрут, если какой-либо другой маршрут не является связанный, он обслуживает тот же html, что и корневой маршрут.
поэтому он в основном обслуживает домашнюю страницу html на этом отключенном маршруте.
Обновление 2
после изучения проблемы мы заметили, что эта маршрутизация работает нормально, так как она находится на Angular 1.0.7 stable, но показывает вышеописанное поведение в Angular 1.1.5 нестабильной.
Я проверил журналы изменений, но пока не нашел ничего полезного, я думаю, мы можем либо представить его как ошибку, либо нежелательное поведение, связанное с определенным изменением, которое они сделали, либо просто подождать и посмотреть, получите исправление в более поздней версии, чтобы быть выпущенной стабильной версией.
Ответы
Ответ 1
Эта проблема объясняется использованием AngularJS 1.1.5 (что было неустойчивым и, очевидно, имело некоторую ошибку или другую реализацию маршрутизации, чем в 1.0.7)
вернувшись к 1.0.7, проблема мгновенно разрешилась.
попробовали версию 1.2.0rc1, но не закончили тестирование, поскольку мне пришлось переписать некоторые функции маршрутизатора, так как они вытащили его из ядра.
в любом случае эта проблема фиксируется при использовании AngularJS vs 1.0.7.
Ответ 2
Узнал, что там нет ошибок.
Просто добавьте:
<base href="/" />
на ваш <head />
.
Ответ 3
Это было лучшее решение, которое я нашел после большего количества времени, чем я признаю. В принципе, добавьте target = "_ self" к каждой ссылке, которая вам нужна для обеспечения перезагрузки страницы.
http://blog.panjiesw.com/posts/2013/09/angularjs-normal-links-with-html5mode/
Ответ 4
$расположение/переключение между html5 и режимом hashbang/переписывание ссылок
- Настройте свой сервер:
https://github.com/angular-ui/ui-router/wiki/Frequently-Asked-Questions#wiki-how-to-configure-your-server-to-work-with-html5mode
Ответ 5
моя проблема решена с помощью:
добавьте это в свою голову:
<base href="/" />
и использовать это в app.config
$locationProvider.html5Mode(true);