Как использовать Angular $ location для установки моего нового местоположения URL, динамически изменяя его параметры ключа?

Скажем, у меня есть конечная точка RESTful, которая принимает ряд фасетов для запроса данных. Вот несколько примеров:

example.com/search?type=Doctor&location=Boston,MA&radius=2  
example.com/search?type=Facility&location=Wayne,NJ&radius=3&gender=f  
example.com/search?type=Doctor&location=Patterson,NJ

Мой модуль принимает объект запроса для выполнения поиска:

console.log(query);
{
  type:'Doctor',
  location:'Boston,MA',
  radius:'2'
}

$scope.getSearch = function(query){
  var search = $search.search(query);
  search.getResults(function(results){
    $scope.results = results;
  });
}

Эти грани передаются через локальную модель в виде веб-формы:

 <input type="text" ng-model="query.location"/>
 <input type="text" ng-model="query.radius"/>
 <button type="button" ng-click="getSearch(query)">Search</button>

В getResults функции getResults я пытаюсь добавить параметры запроса к URL-адресу, как в приведенных выше примерах:

$scope.getSearch = function(query){
  var search = $search.search(query);
  search.getResults(function(results){
    $scope.results = results;
    search.appendQueryToURL(query);
  });
}

Как добавить параметры URL динамически в AngularJS?

Ответы

Ответ 1

Использование $ location

$location.path('/newValue').search({key: value});

Для приложений Non AngularJS:

Вы можете использовать history.js для динамического добавления параметров в url. затем разделить URL-адрес для получения параметров и перейти к угловому:

History.replaceState({state:1}, "State 1", "?Param1=something");

Я предлагаю history.js как IE до тех пор, пока ver9 не будет поддерживать состояние push-объекта истории, если вы собираетесь использовать IE10+ или google chrome, используйте объект состояния истории для обновления URL-адреса. Надеюсь, поможет :)

Ответ 2

В приведенном выше примере путь() вашего местоположения $ будет

'/search' 

и корень

'http://example.com' 

Возвращаясь к его вопросу, он не просил обновить местоположение новым путем, он попросил динамически обновить местоположение с помощью новых запросов пары ключ-значение!

Чтобы сделать это, это просто ежедневный jQuery $ x (newX)!

$location.search({type: x, location: y, radius: z}); 

или

$location.search({type: x, location: y}); 

Все это jQuery !!

Если он хочет изменить путь от поиска к чему-то еще, он может сделать:

$location.path('/otherPath'); 
//his new location would be 'example.com/otherPath' 

Ответ 3

Фактически вместо того, чтобы использовать $ location для вызова конечной точки службы данных, обычный способ сделать это

<form id='searchForm' ng-submit="getDataService()" ng-controller="aController">
<input ng-model="type"/>
<input ng-model="location"/>
<input ng-model="radius"/>
<input ng-model="gender"/>
<button type='submit'/>
</form>

и в getDataService() выполните

$http.get( serviceUrl, config ).success( ...

с вашим сервисом

example.com/search/Facility/Wayne,NJ/3/f

после разбора (используя sprintf)