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/

Ответ 5

моя проблема решена с помощью:

добавьте это в свою голову:

<base href="/" />

и использовать это в app.config

$locationProvider.html5Mode(true);