27

I've essentially run into this problem, where I need a reference to the current route to use gradients, but have yet to figure out how to translate the solution into Angular 2.

1
  • There are various approaches proposed in the answers to this question. If you want to see them compared, see this SO answer. Commented Jun 28, 2020 at 13:11

5 Answers 5

37
constructor(location:Location) {
  console.log(location.prepareExternalUrl(location.path()));
}

https://angular.io/api/common/Location#prepareexternalurl

As the documentation says:

Normalizes an external URL path. If the given URL doesn't begin with a leading slash ('/'), adds one before normalizing. Adds a hash if HashLocationStrategy is in use, or the APP_BASE_HREF if the PathLocationStrategy is in use.

It means that you have to explicitly specify APP_BASE_HREF to get an absolute path in Angular 5+.

window.location provides more information

Plunker example

6
  • Hi, thanks for answering! I'm using the new router library in rc0 which doesn't seem to have a Location provider. Using window.location.pathname does seem to work fine for my purposes though, maybe I was just overthinking it a bit. Commented May 30, 2016 at 5:12
  • 1
    Ah, thanks again, I'd forgotten about @angular/common, I had only checked router and core. Commented May 30, 2016 at 5:21
  • 4
    @GünterZöchbauer This is only displaying after the base address! any updates? Commented Nov 3, 2016 at 22:17
  • 14
    this does not work with angular 5 it gave me just the path Commented Nov 6, 2017 at 20:58
  • 1
    A couple of updates: 1) The actual documentation link is angular.io/api/common/Location#prepareexternalurl 2) As the documentation says: "Normalizes an external URL path. If the given URL doesn't begin with a leading slash ('/'), adds one before normalizing. Adds a hash if HashLocationStrategy is in use, or the APP_BASE_HREF if the PathLocationStrategy is in use.". It means that you have to explicitly specify APP_BASE_HREF to make it works. Tested in Angular 8.1.
    – ne4istb
    Commented Aug 22, 2019 at 10:27
25

You can use the DOCUMENT injection from @angular/common.

import { Component, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/common';

@Component({...})
class SomeComponent {
  constructor(@Inject(DOCUMENT) document: any) {
    console.log(document.location.href);
  }
}
3
  • This was the only working solution I could find for Angular 5+
    – Rohan
    Commented Nov 26, 2018 at 1:08
  • DOCUMENT is deprecated in angular 5+ Commented Apr 23, 2019 at 13:44
  • @SatishPokala it's not in v8, v9
    – s-f
    Commented Apr 15, 2020 at 14:43
21

Location object

The document.location object is your one stop solution.

Use the attributes inside location object from document to get the path in the way you need. Let's see this with an example.

So for https://www.google.com/images

  • document.location.href will return https://www.google.com/images
  • document.location.origin will return https://www.google.com
  • document.location.protocol will return https:
  • document.location.host will return google.com
  • document.location.hostname will return google
  • document.location.pathname will return /images
1
  • the document object is a free object which you can access without any initialization.
    – tibi
    Commented May 20, 2020 at 10:00
2

if you reload page , you can not get route path by Router or ActivatedRoute . You should use window.location.pathname

-1

With base href:

import { DOCUMENT, LocationStrategy } from '@angular/common';


@Injectable()
export class SomeService {
  constructor(@Inject(DOCUMENT) private readonly document: any,
    private readonly locationStrategy: LocationStrategy) {}

  // for localhost: http://localhost:4200/someBaseHref
  getUrl(): string {
    return `${this.document.location.origin}/${this.locationStrategy.getBaseHref()}`
  }

}

Not the answer you're looking for? Browse other questions tagged or ask your own question.