Служба поиска Angularjs $, по-видимому, не анализирует URL-адрес?

Я использую 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-адрес на этом этапе?

Спасибо!


ОБНОВЛЕНИЕ: Мне удалось заставить его работать. Проблема заключалась в том, что я не настраивал сервис. Я сделал это, потому что предположил, что таким образом он будет принимать по умолчанию, но кажется, что это не так, как это работает.

Ответ 1

У меня была такая же проблема, прежде чем я настроил $locationProvider в моей конфигурации модуля приложения:

appModule.config(['$locationProvider', function($locationProvider) {
        $locationProvider.html5Mode(true);
    }]);

Ответ 2

Если вы не хотите указывать базовый тег, вы можете указать require base false.

myapp.config(function($locationProvider) {
    $locationProvider.html5Mode({
      enabled: true,
      requireBase: false
    });
});

Ответ 3

Когда я столкнулся с этой проблемой, другая вещь, которая работала для меня, помимо настройки конфигурации, заключалась в том, чтобы добавить "#" перед строкой запроса.

Итак, если вы создаете строку запроса, а затем измените myapp/?client=clientName
к
myapp/#?client=clientName

разрешено $location.search(), чтобы дать мне непустой объект, который затем можно получить доступ к каждому параметру с помощью $location.search()['client']

Ответ 4

API для $location.search довольно запутан. Вызов

$location.search('client');

установит объект поиска на {client: true} и вернет $location. Кроме того, у вас есть typo client вместо 'client', поэтому он устанавливает поиск в пустой объект. Поэтому вы, вероятно, захотите:

url += '&client=' + $location.search()['client'];

Ответ 5

Вы можете написать функцию, которая анализирует $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'];