Ответ 1
У меня была такая же проблема, прежде чем я настроил $locationProvider
в моей конфигурации модуля приложения:
appModule.config(['$locationProvider', function($locationProvider) {
$locationProvider.html5Mode(true);
}]);
Я использую angular в приложении, которое представляет собой, в основном, таблицу с результатами поиска.
Доступ к этой таблице может быть достигнут с помощью URL-адреса, например http://myapp/?client=clientName
Для таблицы создается экземпляр angular для таблицы, среди прочего, для открытия модального диалога (также angular на основе bootstrap-ui) с деталями строки.
Эти сведения о строках приводятся через службу, которая имеет некоторые общие функции для обоих контроллеров: одну для таблицы и одну для модальной.
Теперь, в этой службе, у меня есть следующий фрагмент для извлечения:
service.fetchRelatedElements = function(element, cb) {
var url = '/search.json?results=20&type='+element.type;
if ($location.search()['client']) {
url += '&client=' + $location.search('client');
}
return doFetch(url, cb); // actual server json GET
};
Цель состоит в том, чтобы знать, есть ли в таблице уже этот специальный параметр client
как фильтр.
Если я положил точку останова в начале этого вызова, я вижу, что $location.absUrl()
возвращает текущий URL-адрес браузера (который, в моем случае, имеет параметр client
, который меня интересует).
Но $location.search()
возвращает пустой объект.
Я ввожу службу $location в свою службу с настройками по умолчанию (то есть не настраивая ее при вызове .config()
).
И, как говорит доктор,
Служба $location анализирует URL-адрес в адресной строке браузера (на основе на window.location) и делает URL доступным для вашего приложение.
Я что-то упустил? Не следует ли анализировать URL-адрес на этом этапе?
Спасибо!
ОБНОВЛЕНИЕ: Мне удалось заставить его работать. Проблема заключалась в том, что я не настраивал сервис. Я сделал это, потому что предположил, что таким образом он будет принимать по умолчанию, но кажется, что это не так, как это работает.
У меня была такая же проблема, прежде чем я настроил $locationProvider
в моей конфигурации модуля приложения:
appModule.config(['$locationProvider', function($locationProvider) {
$locationProvider.html5Mode(true);
}]);
Если вы не хотите указывать базовый тег, вы можете указать require base false.
myapp.config(function($locationProvider) {
$locationProvider.html5Mode({
enabled: true,
requireBase: false
});
});
Когда я столкнулся с этой проблемой, другая вещь, которая работала для меня, помимо настройки конфигурации, заключалась в том, чтобы добавить "#" перед строкой запроса.
Итак, если вы создаете строку запроса, а затем измените
myapp/?client=clientName
к myapp/#?client=clientName
разрешено $location.search(), чтобы дать мне непустой объект, который затем можно получить доступ к каждому параметру с помощью $location.search()['client']
API для $location.search довольно запутан. Вызов
$location.search('client');
установит объект поиска на {client: true} и вернет $location. Кроме того, у вас есть typo client
вместо 'client'
, поэтому он устанавливает поиск в пустой объект. Поэтому вы, вероятно, захотите:
url += '&client=' + $location.search()['client'];
Вы можете написать функцию, которая анализирует $window.location.search на основе этого комментария https://github.com/angular/angular.js/issues/7239#issuecomment-42047533
function parseLocation(location) {
var pairs = location.substring(1).split("&");
var obj = {};
var pair;
var i;
for (i in pairs) {
if (pairs[i] === "")
continue;
pair = pairs[i].split("=");
obj[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);
}
return obj;
}
$scope.query = parseLocation($window.location.search)['query'];