260 votes

Obtenir l'url actuelle en Angular

Comment puis-je obtenir l'url courante dans Angular 4 ? J'ai beaucoup cherché sur le web, mais je n'ai pas trouvé de solution.

app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { RouterModule, Router } from '@angular/Router';

import { AppComponent } from './app.component';
import { TestComponent } from './test/test.component';
import { OtherComponent } from './other/other.component';
import { UnitComponent } from './unit/unit.component';

@NgModule ({
  declarations: [
    AppComponent,
    TestComponent,
    OtherComponent,
    UnitComponent
  ],

  imports: [
    BrowserModule,
    RouterModule.forRoot([
        {
            path: 'test',
            component: TestComponent
        },
        {
            path: 'unit',
            component: UnitComponent
        },
        {
            path: 'other',
            component: OtherComponent
        }
    ]),
  ],

  providers: [],
  bootstrap: [AppComponent]
})

export class AppModule { }

app.component.html

<!-- The content below is only a placeholder and can be replaced -->
<div>
    <h1>Welcome to {{title}}!!</h1>

    <ul>
        <li>
            <a routerLink="/test">Test</a>
        </li>
        <li>
             <a routerLink="/unit">Unit</a>  
        </li>
        <li>
            <a routerLink="/other">Other</a>
        </li>
    </ul>
</div>
<br/>
<router-outlet></router-outlet>

app.component.ts

import { Component} from '@angular/core';

@Component ({
    selector: 'app-root',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.css']
})

export class AppComponent{
    title = 'Angular JS 4';
    arr = ['abcd','xyz','pqrs'];
}

autre.composant.ts

import { Component, OnInit } from '@angular/core';
import { Location } from '@angular/common';
import { Router } from '@angular/router';

@Component({
  selector: 'app-other',
  templateUrl: './other.component.html',
  styleUrls: ['./other.component.css']
})

export class OtherComponent implements OnInit {

    public href: string = "";
    url: string = "asdf";

    constructor(private router : Router) {}

    ngOnInit() {
        this.href = this.router.url;
        console.log(this.router.url);
    }
}

test.component.ts

import { Component, OnInit } from '@angular/core';
import { Location } from '@angular/common';
import { Router } from '@angular/router';

@Component({
  selector: 'app-test',
  templateUrl: './test.component.html',
  styleUrls: ['./test.component.css']
})

export class TestComponent implements OnInit {
    route: string;
    currentURL='';

    constructor() { 
        this.currentURL = window.location.href; 
    }

    ngOnInit() { }
}

En ce moment, j'obtiens un problème de console après avoir cliqué sur autre lien

ERROR Error: Uncaught (in promise): Error: No provider for Router!

0 votes

Quelle url ? ?? url du navigateur et s'il vous plaît ajouter un peu de code les choses que vous avez essayé dans de sorte que de comprendre votre question dans plus de détails

0 votes

Oui, l'url de la page actuelle dans le navigateur

1 votes

@MaciejTreder : lien J'ai déjà utilisé ce lien, mais ça n'a pas marché.

447voto

Maciej Treder Points 4569

Avec du pur JavaScript :

console.log(window.location.href)

Utilisation d'Angular :

this.router.url

import { Component } from '@angular/core';
import { Router } from '@angular/router';

@Component({
    template: 'The href is: {{href}}'
    /*
    Other component settings
    */
})
export class Component {
    public href: string = "";

    constructor(private router: Router) {}

    ngOnInit() {
        this.href = this.router.url;
        console.log(this.router.url);
    }
}

Le plunkr est ici : https://plnkr.co/edit/0x3pCOKwFjAGRxC4hZMy?p=preview

2 votes

Got error : La propriété 'router' n'existe pas sur le type <nom_du_composant>' :(

2 votes

Avez-vous fourni un routeur au constructeur du composant ?

0 votes

import { Component, OnInit } from '@angular/core'; import { Location } from '@angular/common'; import { Router } from '@angular/router'; @Component({ selector: 'app-other', templateUrl: './other.component.html', styleUrls: ['./other.component.css'] }) export class OtherComponent implements OnInit { public href: string = ""; constructor(protected router : Router) {} ngOnInit() { this.href = this.router.url; console.log(this.router.url); } }

79voto

Lalit Sachdeva Points 347

Vous pouvez utiliser le service de localisation disponible dans @angular/common et via le code ci-dessous, vous pouvez obtenir la localisation ou l'URL actuelle.

import { Component, OnInit } from '@angular/core';
import { Location } from '@angular/common';
import { Router } from '@angular/router';

@Component({
  selector: 'app-top-nav',
  templateUrl: './top-nav.component.html',
  styleUrls: ['./top-nav.component.scss']
})
export class TopNavComponent implements OnInit {

  route: string;

  constructor(location: Location, router: Router) {
    router.events.subscribe((val) => {
      if(location.path() != ''){
        this.route = location.path();
      } else {
        this.route = 'Home'
      }
    });
  }

  ngOnInit() {
  }

}

Voici le lien de référence à partir duquel j'ai copié la chose pour obtenir l'emplacement pour mon projet. https://github.com/elliotforbes/angular-2-admin/blob/master/src/app/common/top-nav/top-nav.component.ts

0 votes

Beaucoup plus simplement que toutes ces astuces avec ActivatedRoute etc.

0 votes

Cette réponse met à jour l'url courante quand elle change, les autres ne le font pas.

0 votes

Vous pouvez simplement émettre le premier événement en utilisant l'opérateur first() : router.events.pipe(first()).subscribe((val) => {...});

7voto

ndgeek Points 423

autre.composant.ts

Donc la solution finale correcte est :

import { Component, OnInit } from '@angular/core';
import { Location } from '@angular/common';
import { Router } from '@angular/router'; 

/* 'router' it must be in small case */

    @Component({
      selector: 'app-other',
      templateUrl: './other.component.html',
      styleUrls: ['./other.component.css']
    })

    export class OtherComponent implements OnInit {

        public href: string = "";
        url: string = "asdf";

        constructor(private router : Router) {} // make variable private so that it would be accessible through out the component

        ngOnInit() {
            this.href = this.router.url;
            console.log(this.router.url);
        }
    }

3 votes

Pourriez-vous m'expliquer pourquoi cette solution est la bonne ? Je préférerais obtenir un tableau de type UrlSegment[] au lieu de le travailler avec la Router

0 votes

@ndgeek Le mieux serait d'avoir public href: string = "" remplacé par un get de la propriété. Ainsi, il n'est pas nécessaire d'attribuer la valeur dans la propriété ngOnInit tout en disposant d'une URL de routeur toujours à jour. En tant que tel : get href(); string { return this.router.url; } . Il n'y a pas besoin non plus de le mettre public parce que c'est la valeur par défaut.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X