AngularJS $ location을 사용하여 URL의 쿼리 문자열에서 값 가져 오기


95

$ location.search와 관련하여 문서 는 다음과 같이 말합니다.

매개 변수없이 호출되면 현재 URL의 검색 부분 (객체)을 반환합니다.

내 URL에 내 쿼리 문자열에 값이없는 매개 변수 '? test_user_bLzgB'가 있습니다. 또한 '$ location.search ()'는 객체를 반환합니다. 실제 텍스트는 어떻게 얻습니까?


어떤 물건을 얻습니까? 직면 한 문제를 보여주는 플 런커 또는 바이올린이 있습니까? 당신이 사용할 때 올바른 $location.search()...하지만 난 당신이 그것을 호출 할 때 얻을 수있는 "개체"를 확인하고자하는
callmekatootie

나는 그것이 어떤 대상인지 모른다. 속성을 열거하려고했지만 아무것도없는 것 같습니다.
Ian Warburton

쿼리 문자열을 검사하는 바이올린을 수행하는 방법을 모르겠습니다.
Ian Warburton

답변:


151

수락 된 답변이 수락 된 후 변경되었는지 확실하지 않지만 가능합니다.

$location.search()쿼리 문자열과 동일한 쌍인 키-값 쌍의 개체를 반환합니다. 값이없는 키는 객체에 true로 저장됩니다. 이 경우 개체는 다음과 같습니다.

{"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의 의견에서 지적했듯이 https://code.angularjs.org/1.2.23/docs/guide/$location#-location-service-configuration도$locationProvider 올바르게 구성해야합니다.


3
레쉬가 언급 한 바와 같이, $locationProvider적절히 구성해야합니다 : code.angularjs.org/1.2.23/docs/guide/...를 (이 나를 넘어 희망이 링크를 다른 사람에게 시간을 절약 할 수 있습니다..)
데이비드 Tchepak

2
위치 공급자를 구성하려면 다음이 필요합니다. window.app.config [ '$ locationProvider', ($ locationProvider)-> $ locationProvider.html5Mode true] 또한 HTML 파일에 기본 태그가 필요합니다. <base href = "/">
Amin Ariana 2015 년

책략과 유용한 팁에 감사드립니다. 제 사례를 공유해주세요. userConfig라는 상수를 만들고 모든 것을 내부에 넣습니다. 일부 설정은 사용자 유연성을 위해 쿼리 문자열로 재정의 할 수 있습니다. 나는 이것을 사용하고 HTML 태그에있는 globalController 범위 변수에 쿼리를 넣어 모든 자식 컨트롤러가 서비스를 포함한 매개 변수를 취할 수 있습니다. userConfig도 서비스에 포함되기 때문입니다. 그래서 사실상 그들은 함께 상호 작용할 수 있습니다.
simongcc

js 함수를 사용하는 것이 더 쉽다는 것을 알았습니다. $ location.search ()에는 많은 움직이는 부분이 있습니다. 쿼리 문자열 매개 변수를 얻기위한 코드 예제가 많이 있습니다.
nuander

@TheSharpieOne 잠시 시간이 있으면이 질문을 살펴볼 수 있습니까? stackoverflow.com/questions/43121888/...
레온 Gaban에게

48

쿼리 문자열을 텍스트로보기 만하면되는 경우 다음을 사용할 수 있습니다. $window.location.search


11
이것이 어떻게 답이 아닌가? 조금 짧을 지 모르지만 질문에 대한 답 이되는 것 같습니다.
Léo Lam

타임 스탬프를 확인하면 답변은 Dan의 댓글 2 시간 후에 수정되었습니다. 그다지 중요하지는 않지만, 레오의 댓글이 찬성되어 충격을 받았기 때문에 지적 할 것이라고 생각했습니다.
Bill Tarbell 2015

39

$location.search()키는 변수로, 값은 그 값으로 구성된 객체를 반환합니다. 따라서 다음과 같이 쿼리 문자열을 작성하면 :

?user=test_user_bLzgB

다음과 같은 텍스트를 쉽게 얻을 수 있습니다.

$location.search().user

키, 값 (예 :? foo = bar)을 사용하지 않으려면 #test_user_bLzgB 해시를 사용하는 것이 좋습니다.

그리고 전화

$location.hash()

검색하려는 데이터 인 'test_user_bLzgB'를 반환합니다.

추가 정보:

쿼리 문자열 메서드를 사용하고 $ location.search ()로 빈 개체를 얻는 경우 Angular가 html5 전략 대신 해시 뱅 전략을 사용하고 있기 때문일 수 있습니다. 작동하려면이 구성을 사용자의 기준 치수

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

13

먼저 쿼리 문자열 사용을 얻기위한 URL 형식이 올바른지 확인 #? Q = 문자열 이 나를 위해 작품

http://localhost/codeschool/index.php#?foo=abcd

$ location 서비스를 컨트롤러에 삽입

app.controller('MyController', [ '$location', function($location) { 

    var searchObject = $location.search();

    // $location.search(); reutrn object 
    // searchObject = { foo = 'abcd' };

    alert( searchObject.foo );

} ]);

따라서 출력은 abcd 여야합니다.


10

이것도 사용할 수 있습니다

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');

3
다른 SOF 답변에서 해당 함수를 복사했습니다. 소스를 참조하는 것이 가장 좋습니다.
arcseldon

네 이것은 내가 사용하는 것입니다, 그래서 어딘가에서 그것을 얻었습니다
nuander

10

귀하의 $location.search()작동하지 않는 다음이 있는지 확인하십시오.

1) html5Mode(true)앱의 모듈 구성에서 구성됩니다.

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

2) <base href="https://stackoverflow.com/">HTML에 있습니다.

<head>
  <base href="/">
  ...
</head>

참조 :

  1. 기본 href = "/"
  2. html5Mode

"html5Mode (true)가 앱의 모듈 구성에 구성되어 있습니다."-설명
15ee8f99-57ff-4f92-890c-b56153

@EdPlunkett-죄송합니다. 앵귤러 앱 객체의 config 메서드에서 구성되었다고 말하려고합니다. 예를 들면 다음과 같습니다. var appModule = angular.module ( 'myAppModule', []);
Mahesh

감사합니다. 저는 Angular를
처음 접했습니다

예, 그것은 매우 중요합니다. 같은 문제에 직면했습니다
Bahadir Tasdemir

7

Angular는 이러한 종류의 쿼리 문자열을 지원하지 않습니다.

URL의 쿼리 부분은 &키-값 쌍 의 -분리 된 시퀀스 여야 하므로 객체로 완벽하게 해석 할 수 있습니다.

키-값 쌍 집합을 나타내지 않는 쿼리 문자열을 관리하는 API는 전혀 없습니다.


0

내 NodeJS 예제에는 값을 탐색하고 획득하려는 "localhost : 8080 / Lists / list1.html? x1 = y"라는 URL이 있습니다.

$ location.search ()를 사용하여 x1 = y를 얻기 위해 몇 가지 작업을 수행했습니다.

  1. angular-route.js에 대한 스크립트 소스
  2. 앱 모듈의 종속성에 'ngRoute'삽입
  3. locationProvider 구성
  4. $ location에 대한 기본 태그를 추가합니다 (그렇지 않으면 search (). x1은 아무것도 반환하지 않거나 정의되지 않습니다. 또는 기본 태그에 잘못된 정보가있는 경우 브라우저가 src 스크립트 내에서 파일을 찾을 수 없습니다. .html이 필요합니다. 항상 페이지의보기 소스를 열어 파일 위치를 테스트하세요!)
  5. 위치 서비스 호출 (search ())

내 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();
    });

내 list1.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


0

내 수정은 더 간단하고 공장을 만들고 하나의 변수로 구현합니다. 예를 들면

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}}&param2={{param2}}) -> this is a one variable, the factory searchCustom split and restructure in the array params
-->          
                        <a href="#seach/(param1={{param1}}&param2={{param2}})">
                            <buttom ng-click="searchData()" >Busqueda</buttom>
                        </a>
                    </form> 
</div>
</body>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.