28

I am struggling with clearing out URL params during nav in Angular 2.4.2. I have tried attaching every option to clear the params in the below navigation line, or any mix therein with navigate, or navigateByUrl, but cannot figure out how to accomplish.

this.router.navigateByUrl(this.router.url, { queryParams: {}, preserveQueryParams: false });

As an example I am at route /section1/page1?key1=abc&key2=def and want to stay at the same route but remove all the url parameters, so the end result should be /section/page1

2
  • Maybe - this.location.replaceState(path_only_str) after router event. - angular.io/docs/ts/latest/api/common/index/Location-class.html - What is the referrer? cuz you can also use skipLocationChange on routerLink to remain in the current state. Commented Apr 27, 2017 at 20:01
  • this.router.navigate([], { queryParams: {}, replaceUrl: true }); Commented Feb 6 at 15:53

9 Answers 9

25

As DeborahK pointed out, when I was navigating to this.router.url, that URL already had the url params embedded. To solve I stripped the params off the URL as a string, and then used navigateByUrl to jump there.

let url: string = this.router.url.substring(0, this.router.url.indexOf("?"));
this.router.navigateByUrl(url);
Sign up to request clarification or add additional context in comments.

Comments

14

Using navigateByUrl will drop off the query parameters if you pass it a URL without the query parameters.

Or you could try:

this.router.navigate(this.router.url, { queryParams: {}});

NOTE: navigate and not navigateByUrl

Does that work?

11 Comments

That's what I had thought too, and what the docs seem to indicate should the case, but it's definitely not. In the case mentioned above I use navigateByUrl(this.router.url) while the url is something like "domain.com/section/page?param=a&other=b" ... I'd expect it to have to "domain.com/section/page" but the url parameters persist
You are passing the URL with the query parameters so it will continue to have those parameters. You'd need to pass the url without the parameters.
There are some additional suggestions here: stackoverflow.com/questions/38186636/…
I'm adding one more suggestion to my answer above.
Thanks DeborahK you were totally on the right track; however, that additional suggestion also didn't work, the url parameters would persist since this.router.url has them embedded. I have solved by simply stripping the params off the string manually and then routing by url (self-answered below)
|
13

If you don't want to reload the page you can also use Location

import { Location } from '@angular/common';
[...]
this.location.replaceState(this.location.path().split('?')[0], '');

this.location.path() provides you with the current path. You can remove the params by resetting the page's path with everything in the URL before the ?.

1 Comment

Work perfect if you don't want to refresh the page
11

You can add replaceUrl: true in your navigation extras. This way, the router will navigate to the same page but you still remain in the same state in history with the url parameters gone, while still allowing you to go back to the previous route.

From the docs:

Navigates while replacing the current state in history.

this.router.navigate([], { replaceUrl: true});

Comments

6

Use the skipLocationChange option and it will not show parameters: suppose your url is

http://localhost/view

now something in your code sets the query parameters to

?q=all&viewtype=total

without the skipLocationChange your url in the browser ( after calling navigate) would be :

http://localhost/view?q=all&viewtype=total

with skipLocationChange : true it remains

http://localhost/view

let qp = { q : "all" , viewtype : "total" } 
this.router.navigate(['/view'], {  queryParams: qp,skipLocationChange: true });

2 Comments

As I came late here with the same problem, in my opinion this is the right solution to use
can i use the same for redirecting to external url ? for example I am in xyz.com I want to redirect abc.com . Any suggestions please
6

This will clear the URL with no hardcode and will not re-load the page.

constructor(
        private activatedRoute: ActivatedRoute,
        private router: Router
    )
...
     this.router.navigate([], {
                relativeTo: this.activatedRoute,
                queryParams: {},
                replaceUrl: true,
            });

1 Comment

Worked, nice one! :)
5

Here is a simple one

this.router.navigate([], {});

// Or

this.router.navigate([], {
  queryParams: {
   param1:'',
   param2:''
  }
 });

Comments

3

From angular 7.2 onward, you can use state

Sending

this.router.navigate(['routename'], { state: { param1: 'bar' } });

Receiving

let paramobj = history.state;
console.log(paramobj.param1);

By this you can send even large complex objects from template as well.

4 Comments

Could you provide links to the Angular documentation for information on the API's that you use?
And this history object?
@RobinDeSchepper it is ann inner object of Window object . For more details visit - developer.mozilla.org/en-US/docs/Web/API/Window/history
0

I have updated @Joshua Ohana answer a little bit:

    const getRouterPathUrl = (fullUrl: string): string => (fullUrl.includes("?") ? fullUrl.substring(0, fullUrl.indexOf("?")) : fullUrl);

    this.router.navigate([getRouterPathUrl(this.router.url)],
        {
            queryParams: params,
            replaceUrl: true
        }
    );

This way, you will be able to update and clear query params on any change from your app.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.