AngularJS: How to clear query parameters in the URL?

Angularjs

Angularjs Problem Overview


My AngularJS application needs to have access to the user's LinkedIn profile. In order to do that I need to redirect the user to a LinkedIn URL which contains a callback redirect_uri parameter which will tell LinkedIn to redirect the user back to my webapp and include a "code" query param in the URL. It's a traditional Oauth 2.0 flow.

Everything works great except that LinkedIn redirects the user back to the following URL:

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

I would like to remove ?code=XXX&state=YYY from the URL in order to make it clean. The user does not need to see the query parameters I received from LinkedIn redirect.

I tried $location.absUrl($location.path() + $location.hash()).replace(), but it keep the query params in the URL.

I am also unable to extract the query parameters, e.g. "code", using ($location.search()).code. It seems like having ? before # in the URL above is tricking Angular.

Angularjs Solutions


Solution 1 - Angularjs

I use

$location.search('key', null)

As this not only deletes my key but removes it from the visibility on the URL.

Solution 2 - Angularjs

I ended up getting the answer from AngularJS forum. See this thread for details


The link is to a Google Groups thread, which is difficult to read and doesn't provide a clear answer. To remove URL parameters use

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

Solution 3 - Angularjs

To remove ALL query parameters, do:

$location.search({});

To remove ONE particular query parameter, do:

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

Solution 4 - Angularjs

To clear an item delete it and call $$compose

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

derived from angularjs source : https://github.com/angular/angular.js/blob/c77b2bcca36cf199478b8fb651972a1f650f646b/src/ng/location.js#L419-L443

Solution 5 - Angularjs

You can delete a specific query parameter by using:

delete $location.$$search.nameOfParameter;

Or you can clear all the query params by setting search to an empty object:

$location.$$search = {};

Solution 6 - Angularjs

At the time of writing, and as previously mentioned by @Bosh, html5mode must be true in order to be able to set $location.search() and have it be reflected back into the window’s visual URL.

See https://github.com/angular/angular.js/issues/1521 for more info.

But if html5mode is true you can easily clear the URL’s query string with:

$location.search('');

or

$location.search({});

This will also alter the window’s visual URL.

(Tested in AngularJS version 1.3.0-rc.1 with html5Mode(true).)

Solution 7 - Angularjs

Need to make it work when html5mode = false?

All of the other answers work only when Angular's html5mode is true. If you're working outside of html5mode, then $location refers only to the "fake" location that lives in your hash -- and so $location.search can't see/edit/fix the actual page's search params.

Here's a workaround, to be inserted in the HTML of the page before angular loads:

<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>

Solution 8 - Angularjs

Just use

$location.url();

Instead of

$location.path();

Solution 9 - Angularjs

If you want to move to another URL and clear the query parameters just use:

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

Solution 10 - Angularjs

If you are using routes parameters just clear $routeParams

$routeParams= null;

Solution 11 - Angularjs

How about just setting the location hash to null

$location.hash(null);

Solution 12 - Angularjs

if you process the parameters immediately and then move to the next page, you can put a question mark on the end of the new location.

for example, if you would have done $location.path('/nextPage');

you can do this instead: $location.path('/nextPage?');

Solution 13 - Angularjs

I've tried the above answers but could not get them to work. The only code that worked for me was $window.location.search = ''

Solution 14 - Angularjs

I can replace all query parameters with this single line: $location.search({});
Easy to understand and easy way to clear them out.

Solution 15 - Angularjs

The accepted answer worked for me, but I needed to dig a little deeper to fix the problems with the back button.

What I noticed is that if I link to a page using <a ui-sref="page({x: 1})">, then remove the query string using $location.search('x', null), I don't get an extra entry in my browser history, so the back button takes me back to where I started. Although I feel like this is wrong because I don't think that Angular should automatically remove this history entry for me, this is actually the desired behaviour for my particular use-case.

The problem is that if I link to the page using <a href="/page/?x=1"> instead, then remove the query string in the same way, I do get an extra entry in my browser history, so I have to click the back button twice to get back to where I started. This is inconsistent behaviour, but actually this seems more correct.

I can easily fix the problem with href links by using $location.search('x', null).replace(), but then this breaks the page when you land on it via a ui-sref link, so this is no good.

After a lot of fiddling around, this is the fix I came up with:

In my app's run function I added this:

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

Then I use this code to remove the query string parameter:

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

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionalecswanView Question on Stackoverflow
Solution 1 - AngularjsJuliusView Answer on Stackoverflow
Solution 2 - AngularjsalecswanView Answer on Stackoverflow
Solution 3 - AngularjsRahul DesaiView Answer on Stackoverflow
Solution 4 - AngularjsbasaratView Answer on Stackoverflow
Solution 5 - AngularjsQuintinView Answer on Stackoverflow
Solution 6 - AngularjsFredricView Answer on Stackoverflow
Solution 7 - AngularjsBoshView Answer on Stackoverflow
Solution 8 - AngularjskeviniusView Answer on Stackoverflow
Solution 9 - AngularjsfelippeView Answer on Stackoverflow
Solution 10 - AngularjsOswaldo AlvarezView Answer on Stackoverflow
Solution 11 - AngularjsBwyssView Answer on Stackoverflow
Solution 12 - Angularjsuser5487176View Answer on Stackoverflow
Solution 13 - AngularjsGwen AuView Answer on Stackoverflow
Solution 14 - AngularjsLucas Reppe WelanderView Answer on Stackoverflow
Solution 15 - AngularjsMooView Answer on Stackoverflow