Отключить манипуляцию 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