AngularJS : URL에서 쿼리 매개 변수를 지우는 방법은 무엇입니까?


135

내 AngularJS 응용 프로그램은 사용자의 LinkedIn 프로필에 액세스 할 수 있어야합니다. 그렇게하려면 콜백 redirect_uri 매개 변수가 포함 된 LinkedIn URL로 사용자를 리디렉션해야합니다.이 매개 변수는 LinkedIn에 사용자를 다시 webapp로 리디렉션하고 URL에 "코드"쿼리 매개 변수를 포함하도록 지시합니다. 전통적인 Oauth 2.0 흐름입니다.

LinkedIn이 사용자를 다음 URL로 다시 리디렉션한다는 점을 제외하면 모든 것이 잘 작동합니다.

http://localhost:8080/?code=XXX&state=YYY#/users/123/providers/LinkedIn/social-sites

?code=XXX&state=YYYURL을 깨끗하게 만들기 위해 URL에서 삭제 하고 싶습니다 . 사용자는 LinkedIn 리디렉션에서받은 쿼리 매개 변수를 볼 필요가 없습니다.

을 시도 $location.absUrl($location.path() + $location.hash()).replace()했지만 URL에 쿼리 매개 변수가 유지됩니다.

또한을 사용하여 검색어 매개 변수 (예 : "code")를 추출 할 수 없습니다 ($location.search()).code. 있는 것 같아요? 위의 URL에서 # 전에는 Angular를 속입니다.

답변:


151

나는 사용한다

$location.search('key', null)

이것은 내 키를 삭제 할뿐만 아니라 URL의 가시성에서 제거합니다.


2
이렇게하면 뒤로 버튼과 마찬가지로 크롬에서 뒤로 버튼 루프가 //example.com?key=value로 돌아가지만 //example.com으로 각도가 앞으로 이동합니다. 제안?
jaybro

2
이것은 나에게 코드 문제와 비슷합니다. 당신이 추가 한 방법의 왕이 없다면 Angular는 아무것도 전달해서는 안됩니다. 또한 .replace ()를 추가하면 현재 기록 항목이 바뀝니다.
Julius

viewModelHelper.navigateTo ( 'foo /'); 쿼리 문자열을 foo URL로 유지하고 있었으므로 window.location.href = 'foo /'; 대신에.
jaybro

2
window를 사용하지 말고 대신 Angular의 $ window를 사용하십시오. 단위 테스트가 더 쉬울 것입니다. 더 : docs.angularjs.org/api/ng/service/$window
Julius

이 anwers는 특정 매개 변수를 삭제하려는 경우 완벽하게 작동합니다. 감사합니다.
Dexxo

107

AngularJS 포럼에서 답변을 얻었습니다. 자세한 내용은 이 스레드 를 참조하십시오


링크는 읽기가 어렵고 명확한 답변을 제공하지 않는 Google 그룹스 스레드로 연결됩니다. URL 매개 변수를 제거하려면

$location.url($location.path());

나는 당신이 $ location.path 대신 $ location.url ()에 경로를 넣어야한다고 생각합니다. 위와 같이 두 가지를 병합하려고하면 효과가 없습니다.
mbdev

1
나에게도 효과가 없습니다. 두 함수 모두 쿼리 매개 변수를 그대로 둡니다.
Pablo Ezequiel Leone

실제로 유용한 답변. 필자의 시나리오에서 $ location.path ( '/ reportmaint'). search ({<myparams>})를 처음 트리거 할 때마다 이전 쿼리 매개 변수를 정리하지 않았습니다.
bob.mazzo

이렇게하면 뒤로 버튼과 마찬가지로 크롬에서 뒤로 버튼 루프가 //example.com?key=value로 돌아가지만 //example.com으로 각도가 앞으로 이동합니다. 제안?
jaybro

+1The link is to a Google Groups thread, which is difficult to read and doesn't provide a clear answer
Vlad

70

모든 쿼리 매개 변수 를 제거하려면 다음을 수행하십시오.

$location.search({});

하나의 특정 쿼리 매개 변수 를 제거하려면 다음을 수행하십시오.

$location.search('myQueryParam', null);

2
Angular 1.5에서도 작동합니다.
Manish M Demblani 2016 년

1
나처럼 undefined사용하지 않으려는 경우 에도 작동합니다 null.
HankScorpio 2012 년

내가 싫어하는 것은 브라우저 뒤로 버튼으로 돌아 가면 이전 검색 페이지에서 방금 한 검색어를 잃어 버리는 것입니다.
Gino

@Gino 임시 해결책으로이 재설정 전에 브라우저 기록에 레코드를 추가 할 수 있습니다. stackoverflow.com/q/10541388/586051
Rahul Desai 2014 년

@RahulDesai ng-route를 사용하고 있습니다. 자동으로 처리하기가 어렵습니다
Gino

29

항목을 지우려면 해당 항목을 삭제하고 $$ compose를 호출하십시오.

    if ($location.$$search.yourKey) {
        delete $location.$$search.yourKey;
        $location.$$compose();
    }

angularjs 소스에서 파생 : https://github.com/angular/angular.js/blob/c77b2bcca36cf199478b8fb651972a1f650f646b/src/ng/location.js#L419-L443


2
훌륭한! 매력처럼 일했다.
paulcpederson

이것은 나를 위해 일했지만 Julius의 솔루션이 더 정확하다고 가정합니다. 앵귤러 사람들이 search메소드 를 만들 때 염두에 두었던 것으로 보입니다 . docs.angularjs.org/api/ng/service/$location#search
zmilojko

1
고마워, 이것은 꽤 잘 작동했습니다 ... 흥미롭게도 IE8은 해당 URL을 설정 / 구성 한 다음로드를 좋아합니다. 이것이 올바른 라우팅이 선호되는 이유이며 우리 모두가 나쁜 사람들이라고 확신합니다. : P
Romanulus

27

다음을 사용하여 특정 쿼리 매개 변수를 삭제할 수 있습니다.

delete $location.$$search.nameOfParameter;

또는 검색을 빈 개체로 설정하여 모든 쿼리 매개 변수를 지울 수 있습니다.

$location.$$search = {};

2
이유를 모르겠지만 페이지를 전환하는 동안이 솔루션이 제대로 작동하지 않습니다 (매개 변수 $location.$$search = {}가 실행될 때 매개 변수가 다시 나타날 수 있음 ). @basarat 솔루션이 잘 작동합니다.
Mik378

1
나를 위해 잘 작동했습니다-매개 변수를 제거하고 경로를 변경하는 순서를 확인하십시오.
demaniak

1
이것이 작동하더라도 수정해서는 안되는 개인 변수에 액세스 할 수 있지만 다른 솔루션에 대해서는 @Julius의 답변을 참조하십시오.
Ben Taliadoros

26

이전 @Bosh 언급으로 글을 쓰는 시점에서, 그리고 html5mode해야 true설정할 수하기 위해$location.search() 그리고 그것은 다시 윈도우의 시각적 URL에 반영 될 수 있습니다.

참조 https://github.com/angular/angular.js/issues/1521를 을 .

그러나 경우가 html5mode 있습니다true 쉽게와 URL의 쿼리 문자열을 지울 수 있습니다 :

$location.search('');

또는

$location.search({});

또한 창의 시각적 URL이 변경됩니다.

(AngularJS와 버전에서 테스트 1.3.0-rc.1html5Mode(true).)


12

html5mode= 때 작동하도록해야 false합니까?

다른 모든 답변 html5mode은 Angular 's 가 인 경우에만 작동합니다 true. 당신이 외부로 작업하는 경우 html5mode, 다음 $location등 -에만 해시 생활하는 "가짜"위치를 참조 $location.search볼 수 없습니다 / 편집 / 실제 페이지의 검색 PARAMS를 해결.

각도로드 전에 페이지의 HTML에 삽입되는 해결 방법은 다음과 같습니다 .

<script>
  if (window.location.search.match("code=")){
    var newHash = "/after-auth" + window.location.search;
    if (window.history.replaceState){
      window.history.replaceState( {}, "", window.location.toString().replace(window.location.search, ""));
    }
    window.location.hash = newHash;
  }
</script>

2
html5Mode를 true로 구성하지 않는 또 다른 방법 은 ? 바로 앞에 # 가 포함되도록 쿼리 문자열을 만드는 것입니다 . . 그래서이 myapp/#?client=clientName 대신에 myapp/?client=clientName
천사 가오


4

다른 URL로 이동하고 쿼리 매개 변수를 지우려면 다음을 사용하십시오.

$location.path('/my/path').search({});

1

경로 매개 변수를 사용하는 경우 $ routeParams를 지우십시오.

$routeParams= null;

1
로컬 변수 $routeParams를로 설정합니다 null. 실제로 주소 표시 줄의 URL 매개 변수에는 전혀 영향을 미치지 않습니다.
Eric F.

1

위치 해시를 null로 설정하는 방법은 무엇입니까?

$location.hash(null);

0

매개 변수를 즉시 처리 한 후 다음 페이지로 이동하면 새 위치 끝에 물음표를 넣을 수 있습니다.

예를 들어 $ location.path ( '/ nextPage');

대신이 작업을 수행 할 수 있습니다. $ location.path ( '/ nextPage?');


0

위의 답변을 시도했지만 작동시키지 못했습니다. 나를 위해 일한 유일한 코드는$window.location.search = ''


0

모든 쿼리 매개 변수를이 한 줄로 바꿀 수 있습니다. $location.search({});
이해하기 쉽고 쉽게 지우는 방법입니다.


0

받아 들인 대답은 나를 위해 일했지만 뒤로 버튼으로 문제를 해결하기 위해 조금 더 깊이 파고 들어야했습니다.

내가 주목 한 것은를 사용하여 페이지에 링크하면 <a ui-sref="page({x: 1})">다음을 사용하여 쿼리 문자열을 제거한다는 것입니다.$location.search('x', null) 브라우저 기록에 추가 항목이 없으므로 뒤로 버튼을 누르면 시작한 곳으로 돌아갑니다. Angular가 자동 으로이 기록 항목을 제거해야한다고 생각하지 않기 때문에 이것이 잘못되었다고 생각하지만 실제로는 특정 사용 사례에 대해 원하는 동작입니다.

문제는 내가 사용하는 페이지로 링크하는 경우이다 <a href="https://stackoverflow.com/page/?x=1">대신, 나는이 같은 방식으로 쿼리 문자열을 제거 내가 뒤로 버튼을 클릭해야하므로, 브라우저의 역사에서 추가 항목을 얻을 두 번 내가 시작했던 곳으로 돌아 가야 . 이것은 일관되지 않은 동작이지만 실제로 이것은 더 정확한 것 같습니다.

href을 사용하여 링크 관련 문제를 쉽게 해결할 수 $location.search('x', null).replace()있지만 ui-sref링크 를 통해 페이지를 방문하면 페이지가 손상 되므로 좋지 않습니다.

많은 어려움을 겪은 후에 이것은 내가 생각해 낸 수정입니다.

내 앱 run기능에서 다음을 추가했습니다.

$rootScope.$on('$locationChangeSuccess', function () {
    $rootScope.locationPath = $location.path();
});

그런 다음이 코드를 사용하여 쿼리 문자열 매개 변수를 제거합니다.

$location.search('x', null);

if ($location.path() === $rootScope.locationPath) {
    $location.replace();
}

0

들어 각도> 2 , 당신은 모두 삭제하려는 PARAMS을 널 (null)을 통과 할 수있다

this.router.navigate(['/yourRoute'], {queryParams:{params1: null, param2: null}})
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.