Отключить манипуляцию URL в AngularJS

Я пытаюсь написать свое первое веб-приложение с помощью Angular.

В нормальном режиме (html5Mode off), Angular заставляет хэш-часть адреса выглядеть как "путь" (добавление ведущего "/" ) и кодирует специальные символы - например, он позволяет использовать один "?" и "#" в хеше и заменяет остальные% 3F и% 23.

Есть ли способ отключить эту функцию? Я не хочу использовать функции $locationProvider/$routeProvider - я сам сам разбираю хеш (в моем случае пользователь вводит некоторый "свободный текст" в хеше для поиска внутри моего сайта).

Я читал, что routeProvider не может быть настроен на использование регулярных выражений...

Если htmlMode включен, то хэш-часть адреса не будет выглядеть как путь (без ведущего "/" ), но он по-прежнему кодирует специальные символы.

Я знаю, что некоторые браузеры могут в любом случае кодировать/удалять специальные символы, но если пользователю удалось ввести некоторые специальные символы в свою адресную строку, я не хочу его изменять.

Спасибо

Ответ 1

Не уверен в побочных эффектах этого, но он выполняет свою работу. Обратите внимание, что он отключит все манипуляции с местоположением в угловом приложении, даже если он предназначен.

angular.module('sample', [])
    .config( ['$provide', function ($provide){
        $provide.decorator('$browser', ['$delegate', function ($delegate) {
            $delegate.onUrlChange = function () {};
            $delegate.url = function () { return ""};
            return $delegate;
        }]);
    }]);

вариант ES6:

angular.module('sample', [])
    .config(["$provide", $provide => {
        $provide.decorator("$browser", ["$delegate", $delegate => {
            $delegate.onUrlChange = () => { };
            $delegate.url = () => "";

            return $delegate;
        }]);
    }]);

Протестировано в Chrome 30, IE9, IE10.
Вдохновлен fooobar.com/questions/19840/...

Ответ 2

Я использую локальную копию angular.js. Поиск

$browser.onUrlChange(function(newUrl, newState) {

и

$rootScope.$watch(function $locationWatch() {

закомментируйте соответствующие строки, и угловые будут останавливать просмотр изменений URL-адресов местоположения.

Ответ 3

Если я правильно помню, маршрутизация Angular не обязательна, но тогда вы должны позаботиться о перезагрузке контроллеров, представлений и т.д.

Ответ 4

Спасибо @greg.kindel ответ, вы помогаете мне найти решение для решения проблемы привязки. Этот код позволяет AngularJS приложению игнорировать некоторые хэш-паттерны, оставляя их работающими как браузер по умолчанию Мне не нужно включать html5Mode, и ngRoute все еще работает. :)

app.config(['$provide', function ($provide) {
    $provide.decorator('$browser', ['$delegate', '$window', function ($delegate, $window) {
        // normal anchors
        let ignoredPattern = /^#[a-zA-Z0-9].*/;
        let originalOnUrlChange = $delegate.onUrlChange;
        $delegate.onUrlChange = function (...args) {
            if (ignoredPattern.test($window.location.hash)) return;
            originalOnUrlChange.apply($delegate, args);
        };
        let originalUrl = $delegate.url;
        $delegate.url = function (...args) {
            if (ignoredPattern.test($window.location.hash)) return $window.location.href;
            return originalUrl.apply($delegate, args);
        };
        return $delegate;
    }]);
}]);

Проверено в Chrome 69, Firefox 62

AngularJS 1.7.4