Programing

AngularJS에서 쿼리 매개 변수를 읽는 가장 간결한 방법은 무엇입니까?

lottogame 2020. 3. 11. 00:43
반응형

AngularJS에서 쿼리 매개 변수를 읽는 가장 간결한 방법은 무엇입니까?


AngularJS를 사용하여 URL 쿼리 매개 변수의 값을 읽고 싶습니다. 다음 URL을 사용하여 HTML에 액세스하고 있습니다.

http://127.0.0.1:8080/test.html?target=bob

예상대로 location.search입니다 "?target=bob". target 값에 액세스하기 위해 웹에 나열된 다양한 예제를 찾았지만 AngularJS 1.0.0rc10에서는 작동하지 않습니다. 특히 다음은 모두입니다 undefined.

  • $location.search.target
  • $location.search['target']
  • $location.search()['target']

누가 효과가 있는지 아는 사람 있습니까? ( $location내 컨트롤러에 매개 변수로 사용 하고 있습니다)


최신 정보:

아래에 솔루션을 게시했지만 완전히 만족하지는 않습니다. 에서 문서 개발자 가이드 : 각도 서비스 : $ 위치를 사용하여이 에 대한 다음 상태 $location:

언제 $ location을 사용해야합니까?

응용 프로그램이 현재 URL의 변경에 반응하거나 브라우저에서 현재 URL을 변경하려는 경우 언제든지.

내 시나리오의 경우 내 페이지가 쿼리 매개 변수를 사용하여 외부 웹 페이지에서 열리므로 "현재 URL의 변경에 반응하지 않습니다". 어쩌면 $location작업에 적합한 도구가 아닐 수도 있습니다 (추악한 세부 사항은 아래 답변을 참조하십시오). 따라서이 질문의 제목을 "$ location을 사용하여 AngularJS에서 쿼리 매개 변수를 읽는 방법"에서 변경했습니다. "AngularJS에서 쿼리 매개 변수를 읽는 가장 간결한 방법은 무엇입니까?" 분명히 자바 스크립트와 정규 표현식을 사용하여 구문 분석 할 수 location.search는 있지만 저수준으로 이동하면 프로그래머의 감수성을 실제로 손상시킵니다.

그래서 : $location내 대답보다 더 나은 방법이 있습니까? 아니면 간결한 대안이 있습니까?


당신은 삽입 할 수 $ routeParams을 (필요 ngRoute을 컨트롤러로). 다음은 문서의 예입니다.

// Given:
// URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby
// Route: /Chapter/:chapterId/Section/:sectionId
//
// Then
$routeParams ==> {chapterId:1, sectionId:2, search:'moby'}

편집 : $ location 서비스 ( ng) 에서 쿼리 매개 변수를 가져오고 설정할 수 있습니다 . 특히 $ location.search ()search 메소드 입니다.

$ routeParams는 컨트롤러의 초기로드 후 유용성이 떨어집니다. $location.search()언제든지 호출 할 수 있습니다.


html5 모드로 작업하는 것이 좋지만 hashbang 모드에서 작동하도록 할 수도 있습니다.

간단하게 사용할 수 있습니다 :

$location.search().target

'타겟'검색 매개 변수에 액세스합니다.

참고로, 작동하는 jsFiddle은 다음과 같습니다. http://web.archive.org/web/20130317065234/http://jsfiddle.net/PHnLb/7/

var myApp = angular.module('myApp', []);

function MyCtrl($scope, $location) {

    $scope.location = $location;
    $scope.$watch('location.search()', function() {
        $scope.target = ($location.search()).target;
    }, true);

    $scope.changeTarget = function(name) {
        $location.search('target', name);
    }
}
<div ng-controller="MyCtrl">

    <a href="#!/test/?target=Bob">Bob</a>
    <a href="#!/test/?target=Paul">Paul</a>
    
    <hr/>    
    URL 'target' param getter: {{target}}<br>
    Full url: {{location.absUrl()}}
    <hr/>
    
    <button ng-click="changeTarget('Pawel')">target=Pawel</button>
    
</div>


내 자신의 질문에 부분 답변을 제공하기 위해 HTML5 브라우저에 대한 실제 샘플은 다음과 같습니다.

<!DOCTYPE html>
<html ng-app="myApp">
<head>
  <script src="http://code.angularjs.org/1.0.0rc10/angular-1.0.0rc10.js"></script>
  <script>
    angular.module('myApp', [], function($locationProvider) {
      $locationProvider.html5Mode(true);
    });
    function QueryCntl($scope, $location) {
      $scope.target = $location.search()['target'];
    }
  </script>
</head>
<body ng-controller="QueryCntl">

Target: {{target}}<br/>

</body>
</html>

열쇠는 $locationProvider.html5Mode(true);위와 같이 전화 하는 것이 었습니다 . 이제 열 때 작동합니다 http://127.0.0.1:8080/test.html?target=bob. 구형 브라우저에서는 작동하지 않는다는 사실에 만족하지 않지만 어쨌든이 방법을 사용할 수 있습니다.

구형 브라우저에서 작동하는 대안은 html5mode(true)전화를 끊고 대신 해시 + 슬래시와 함께 다음 주소를 사용하는 것입니다.

http://127.0.0.1:8080/test.html#/?target=bob

관련 문서는 개발자 안내서 : Angular Services : $ location 사용 (Google 검색에서 찾지 못한 이상한 것입니다.)에 있습니다.


두 가지 방법으로 수행 할 수 있습니다.

  1. 사용 $routeParams

최상의 권장 솔루션은 $routeParams컨트롤러 에 사용 하는 것입니다. 그것은 필요 ngRoute설치할 모듈을.

   function MyController($scope, $routeParams) {
      // URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby
      // Route: /Chapter/:chapterId/Section/:sectionId
      // $routeParams ==> {chapterId:'1', sectionId:'2', search:'moby'}
      var search = $routeParams.search;
  }
  1. 사용 $location.search().

여기에 경고가 있습니다. HTML5 모드에서만 작동합니다. 기본적으로 해시 ( #) 가없는 URL에는 작동하지 않습니다http://localhost/test?param1=abc&param2=def

#/URL 을 추가하여 작동시킬 수 있습니다 .http://localhost/test#/?param1=abc&param2=def

$location.search() 다음과 같은 객체를 반환하려면

{
  param1: 'abc',
  param2: 'def'
}

$ location.search ()는 HTML5 모드가 켜져 있고 지원되는 브라우저에서만 작동합니다.

이것은 항상 작동합니다 :

$ window.location.search


그냥 여름에.

앱이 외부 링크에서로드되는 경우 angular는 이것을 URL 변경으로 감지하지 않으므로 $ loaction.search ()가 빈 객체를 제공합니다. 이 문제를 해결하려면 앱 구성에서 다음을 설정해야합니다 (app.js)

.config(['$routeProvider', '$locationProvider', function ($routeProvider,     $locationProvider) 
{
   $routeProvider
      .when('/', {
         templateUrl: 'views/main.html',
         controller: 'MainCtrl'
      })
      .otherwise({
         redirectTo: '/'
      });

      $locationProvider.html5Mode(true);
 }]);

엘리스 화이트 헤드의 정답입니다. 태그가 $locationProvider.html5Mode(true);있는 애플리케이션의 기본 URL을 지정 <base href="">하거나 매개 변수 requireBase를로 설정 하지 않으면 새 버전의 angularjs에서 작동하지 않습니다.false

문서에서 :

html5Mode (history.pushState)를 사용하도록 $ location을 구성하는 경우 태그가있는 응용 프로그램의 기본 URL을 지정하거나 requireBase : false가있는 정의 객체를 $ locationProvider에 전달하여 $ locationProvider가 기본 태그를 요구하지 않도록 구성해야합니다. html5Mode () :

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

$ location. $$ search.yourparameter를 사용할 수도 있습니다


이것은 당신을 도울 수 있습니다

AngularJS에서 쿼리 매개 변수를 읽는 가장 간결한 방법은 무엇입니까

// Given:
// URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby
// Route: /Chapter/:chapterId/Section/:sectionId
//
// Then
$routeParams ==> {chapterId:1, sectionId:2, search:'moby'}

<!DOCTYPE html>
<html ng-app="myApp">
<head>
  <script src="http://code.angularjs.org/1.0.0rc10/angular-1.0.0rc10.js"></script>
  <script>
    angular.module('myApp', [], function($locationProvider) {
      $locationProvider.html5Mode(true);
    });
    function QueryCntl($scope, $location) {
      $scope.target = $location.search()['target'];
    }
  </script>
</head>
<body ng-controller="QueryCntl">

Target: {{target}}<br/>

</body>
</html>

($location.search()).target

SPA HTML5Mode의 경우 많은 404 오류 문제가 발생하며이 경우 $ location.search를 작동시킬 필요가 없습니다. 필자의 경우 사용자가 처음에 연결하는 "페이지"에 관계없이 사용자가 내 사이트를 방문 할 때 URL 쿼리 문자열 매개 변수를 캡처하고 로그인하면 해당 페이지로 보낼 수 있습니다. app.run에있는 것들

$rootScope.$on('$stateChangeStart', function (e, toState, toParams, fromState, fromParams) {
    if (fromState.name === "") {
        e.preventDefault();
        $rootScope.initialPage = toState.name;
        $rootScope.initialParams = toParams;
        return;
    }
    if ($location.search().hasOwnProperty('role')) {
        $rootScope.roleParameter = $location.search()['role'];
    }
    ...
}

나중에 로그인 후 $ state.go ($ rootScope.initialPage, $ rootScope.initialParams)라고 말할 수 있습니다.


조금 늦었지만 문제가 URL이라고 생각합니다. 대신에

http://127.0.0.1:8080/test.html?target=bob

너는

http://127.0.0.1:8080/test.html#/?target=bob

나는 그것이 효과가 있었을 것이라고 확신한다. Angular는 실제로 # /에 대해 까다 롭습니다.

참고 URL : https://stackoverflow.com/questions/11063673/whats-the-most-concise-way-to-read-query-parameters-in-angularjs

반응형