Получение значений из строки запроса в URL-адресе с использованием местоположения AngularJS $
Что касается $location.search, docs говорят,
Возвращайте часть поиска (как объект) текущего url при вызове без какого-либо параметра.
В моем url моя строка запроса имеет параметр "test_user_bLzgB" без значения. Также '$ location.search()' возвращает объект. Как получить фактический текст?
Ответы
Ответ 1
Не уверен, что он изменился с момента принятия принятого ответа, но это возможно.
$location.search()
возвращает объект пар ключ-значение, те же пары, что и строка запроса. Ключ, который не имеет значения, просто сохраняется в объекте как истинный. В этом случае объектом будет:
{"test_user_bLzgB": true}
Вы можете получить это значение непосредственно с помощью $location.search().test_user_bLzgB
Пример (с большей строкой запроса): http://fiddle.jshell.net/TheSharpieOne/yHv2p/4/show/?test_user_bLzgB&somethingElse&also&something=Somethingelse
Примечание: из-за хэшей (как это будет в http://fiddle.jshell.net/#/url, что создаст новую скрипку), эта скрипка не будет работать в браузерах, которые не поддерживают js-историю (не будут работать в IE и 10)
Изменить:
Как указано в комментариях @Naresh и @DavidTchepak, необходимо также правильно настроить $locationProvider
: https://code.angularjs.org/1.2.23/docs/guide/$location#-location-service-configuration
Ответ 2
Если вам просто нужно посмотреть строку запроса как текст, вы можете использовать: $window.location.search
Ответ 3
$location.search()
возвращает объект, состоящий из ключей как переменных, и значения в качестве значения.
Итак: если вы пишете строку запроса следующим образом:
?user=test_user_bLzgB
Вы можете легко получить текст так:
$location.search().user
Если вы не хотите использовать ключ, значение, подобное? foo = bar, я предлагаю использовать хэш #test_user_bLzgB,
и вызов
$location.hash()
вернет 'test_user_bLzgB', который является данными, которые вы хотите получить.
Дополнительная информация:
Если вы использовали метод строки запроса и получаете пустой объект с $location.search(),
вероятно, потому, что Angular использует стратегию hashbang вместо html5...
Чтобы заставить его работать, добавьте эту конфигурацию в свой модуль
yourModule.config(['$locationProvider', function($locationProvider){
$locationProvider.html5Mode(true);
}]);
Ответ 4
Сначала сделайте правильный формат URL-адреса для получения строки запроса #? q = string, которая работает для меня
http://localhost/codeschool/index.php#?foo=abcd
Ввести функцию определения местоположения $в контроллер
app.controller('MyController', [ '$location', function($location) {
var searchObject = $location.search();
// $location.search(); reutrn object
// searchObject = { foo = 'abcd' };
alert( searchObject.foo );
} ]);
Таким образом, out должен быть abcd
Ответ 5
вы также можете использовать это
function getParameterByName(name) {
name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
results = regex.exec(location.search);
return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}
var queryValue = getParameterByName('test_user_bLzgB');
Ответ 6
Если ваш $location.search()
не работает, убедитесь, что у вас есть следующее:
1) html5Mode(true)
настроен в конфигурации модуля приложения
appModule.config(['$locationProvider', function($locationProvider) {
$locationProvider.html5Mode(true);
}]);
2) <base href="/">
присутствует в вашем HTML
<head>
<base href="/">
...
</head>
Ссылки:
Ответ 7
Angular не поддерживает такую строку запроса.
Часть запроса URL-адреса должна быть &
-сепаратированной последовательностью пар ключ-значение, поэтому она прекрасно интерпретируется как объект.
Нет никакого API для управления строками запросов, которые не представляют собой пары пар ключ-значение.
Ответ 8
В моем примере NodeJS у меня есть url "localhost: 8080/Lists/list1.html? x1 = y", который я хочу пройти и получить значения.
Чтобы работать с $location.search(), чтобы получить x1 = y, я сделал несколько вещей
- script источник angular -route.js
- Ввести "ngRoute" в зависимости от вашего приложения.
- Конфигурируйте ваше местоположениеProvider
- Добавьте базовый тег для $location (если вы этого не сделаете, ваш поиск(). x1 ничего не вернет или undefined. Или, если у базового тега неверная информация, ваш браузер не сможет найти ваш файлы внутри script src, которые нужны вашему .html. Всегда открывайте источник просмотра страницы, чтобы проверить расположение файлов!)
- вызвать службу определения местоположения (search())
my list1.js имеет
var app = angular.module('NGApp', ['ngRoute']); //dependencies : ngRoute
app.config(function ($locationProvider) { //config your locationProvider
$locationProvider.html5Mode(true).hashPrefix('');
});
app.controller('NGCtrl', function ($scope, datasvc, $location) {// inject your location service
//var val = window.location.href.toString().split('=')[1];
var val = $location.search().x1; alert(val);
$scope.xout = function () {
datasvc.out(val)
.then(function (data) {
$scope.x1 = val;
$scope.allMyStuffs = data.all;
});
};
$scope.xout();
});
и мой список1.html имеет
<head>
<base href=".">
</head>
<body ng-controller="NGCtrl">
<div>A<input ng-model="x1"/><br/><textarea ng-model="allMyStuffs"/></div>
<script src="../js/jquery-2.1.4.min.js"></script>
<script src="../js/jquery-ui.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.9/angular-route.js"></script>
<script src="../js/bootstrap.min.js"></script>
<script src="../js/ui-bootstrap-tpls-0.14.3.min.js"></script>
<script src="list1.js"></script>
</body>
Руководство: https://code.angularjs.org/1.2.23/docs/guide/$location
Ответ 9
Мое исправление более простое, создайте factory и реализуйте как одну переменную. Например
angular.module('myApp', [])
// This a searchCustom factory. Copy the factory and implement in the controller
.factory("searchCustom", function($http,$log){
return {
valuesParams : function(params){
paramsResult = [];
params = params.replace('(', '').replace(')','').split("&");
for(x in params){
paramsKeyTmp = params[x].split("=");
// Si el parametro esta disponible anexamos al vector paramResult
if (paramsKeyTmp[1] !== '' && paramsKeyTmp[1] !== ' ' &&
paramsKeyTmp[1] !== null){
paramsResult.push(params[x]);
}
}
return paramsResult;
}
}
})
.controller("SearchController", function($scope, $http,$routeParams,$log,searchCustom){
$ctrl = this;
var valueParams = searchCustom.valuesParams($routeParams.value);
valueParams = valueParams.join('&');
$http({
method : "GET",
url: webservice+"q?"+valueParams
}).then( function successCallback(response){
data = response.data;
$scope.cantEncontrados = data.length;
$scope.dataSearch = data;
} , function errorCallback(response){
console.log(response.statusText);
})
})
<html>
<head>
</head>
<body ng-app="myApp">
<div ng-controller="SearchController">
<form action="#" >
<input ng-model="param1"
placeholder="param1" />
<input ng-model="param2"
placeholder="param2"/>
<!-- Implement in the html code
(param1={{param1}}¶m2={{param2}}) -> this is a one variable, the factory searchCustom split and restructure in the array params
-->
<a href="#seach/(param1={{param1}}¶m2={{param2}})">
<buttom ng-click="searchData()" >Busqueda</buttom>
</a>
</form>
</div>
</body>