Come ottenere il percorso corrente


472

I documenti attuali parlano solo di ottenere parametri di rotta, non i segmenti di rotta effettivi.

Ad esempio, se voglio trovare il genitore del percorso corrente, come è possibile?


25
window.location.pathname
Dchacke,

1
@dchacke il problema window.locationè che se in futuro vogliono implementare il rendering sul lato server, dovranno affrontare alcune difficoltà poiché windownon esiste sul server Node.js, ma devono usare i metodi standard angolari per accedere al percorso e andranno bene sia sul server che sul browser.
Mohammad Kermani,

Sì, ha senso. Chi utilizza o prevede di utilizzare il rendering sul lato server dovrebbe tenerne conto.
Dchacke

Risposte:


523

Il nuovo router V3 ha una proprietà url.

this.router.url === '/login'

5
Uso questo codice e ottengo questo URL nella variabile stringa ma quando provo a stampare nella console .log non stampa this.fullUrl = this.router.url console.log (this.fullUrl); // non stampa
vijay gupta,

3
Guarda come utilizzare la nuova funzionalità attiva del router <a routerLink="/dashboard" routerLinkActive="active"> Dashboard </a>
Victor96

34
questo è inutile quando si naviga con la strategia Hash, l'URL è sempre "/"
Ninja Coding

5
@NinjaCoding Sto usando la strategia Hash e sto ottenendo solo "/". Come posso ottenere l'URL del percorso con Hash?
Murtuza,

9
@Murtuza Ecco una soluzione: this.router.events.filter((event: any) => event instanceof NavigationEnd).subscribe(event => { console.log('this is what your looking for ', event.url); });. Assicurati di importareimport { Router, NavigationEnd } from '@angular/router';
Gel

161

RC4 angolare:

Puoi importare Routerda@angular/router

Quindi iniettalo:

constructor(private router: Router ) {

}

Quindi chiama il parametro URL:

console.log(this.router.url); //  /routename

2
La chiarezza extra su come importare il router stesso è molto utile. Potresti chiarire se sarebbe diverso se utilizzassi un router personalizzato?
kbpontius,

1
Ciò dipenderebbe certamente dalla "consuetudine" del router personalizzato. (scusate se questo non è stato un commento particolarmente utile - se avete una domanda specifica, suggerirei di fare una nuova domanda e fare riferimento a questa risposta)
lowcrawler

42
Ho usato questa soluzione, ma ottengo sempre questo "/". Qualcuno sa perché?
Marcio M.,

4
Iniezione di dipendenza angolare si basa sulla sintassi Sugar di TypeScript, quindi quando si dichiara _router privato: router nella firma del costruttore, una proprietà _router viene automaticamente creata nell'istanza di classe corrente con il router iniettato. Questa affermazione this.router = _router; è solo un sovraccarico per me, dato che avresti due riferimenti alla stessa istanza di oggetto (in quel caso, il router).
Andrew Reborn,

1
@Marcio M. Potrebbe essere perché il router non ha effettivamente raggiunto quello stato, anche se l'URL mostra diverso. Ad esempio, se dai un'occhiata a router.url in un servizio di guardia. location.path (), come indicato nelle risposte, ti darà l'URL, indipendentemente dallo stato del router.
Daniel van Niekerk,

61

Iniettare Locationnel componente e leggere location.path(); È necessario aggiungere ROUTER_DIRECTIVESda qualche parte in modo che Angular possa risolversi Location. Devi aggiungere import: [RouterModule]al modulo.

Aggiornare

Nel router V3 (RC.3) è possibile iniettare ActivatedRoutee accedere a maggiori dettagli usando la sua snapshotproprietà.

constructor(private route:ActivatedRoute) {
  console.log(route);
}

o

constructor(private router:Router) {
  router.events.subscribe(...);
}

Vedi anche Listener di eventi del router Angular 2


3
questo mi dà il percorso "url". come faccio a trovare i "nomi delle rotte" in modo da poterli passare in un array al navigatemetodo insieme al nome (aggiunto) della rotta figlio a cui voglio navigare.
pdeva,

Vedo. Inoltre non lo trovo soddisfacente. Non l'ho provato da solo, ma forse quello MyTrackingServicespiegato in stackoverflow.com/a/34548656/217408 consentirebbe di accedere a questi valori.
Günter Zöchbauer,

I nomi delle rotte sono spariti ora.
Günter Zöchbauer,

4
@GunterZochbauer c'è un modo per ottenere il percorso richiesto prima che venga attivato? Ad esempio, se voglio memorizzare il percorso richiesto all'interno di un canActivate()metodo, in modo da poter reindirizzare a una pagina di "accesso" e quindi reindirizzare al percorso originale dopo che l'utente si è autenticato?
Evgenij Ananin il

1
Non puoi farlo con una guardia canActivate?
Günter Zöchbauer,

42

per nuovo router> = RC.3

Il modo migliore e semplice per farlo è!

import { Router } from '@angular/router';
constructor(router: Router) { 
      router.events.subscribe((url:any) => console.log(url));
      console.log(router.url);  // to print only path eg:"/login"
}

In che modo questa risposta differisce da quella del lowcrawler?
not2savvy,

1
@ not2savvy ha dato un altro modo per scoprire lo stesso attraverso l'ascoltatore di eventi del router, che ha aiutato alcune persone a trovare quello che stavano cercando.
Rajath MS,

36

Usa questo

import { Router, NavigationEnd } from '@angular/router';

constructor(private router: Router) {
    router.events.filter(event => event instanceof NavigationEnd)
        .subscribe(event => {
            console.log(event);
        });
}

E in main.tsimportazione

import 'rxjs/add/operator/filter';

MODIFICARE

Modo moderno

import {filter} from 'rxjs/operators';

router.events.pipe(
    filter(event => event instanceof NavigationEnd)
)
    .subscribe(event => {
        console.log(event);
    });

11
È davvero il modo consigliato di fare qualcosa di semplice come controllare dove punta l'URL corrente? Non sto discutendo contro di te su questo. Tuttavia, ho notato che il routing è una fonte di molte modifiche, aggiornamenti, confusioni, ecc. Mi aspettavo che ActivatedRoute sarebbe stato utilizzato principalmente per questo, non per il router . Mi sto perdendo la complessità del problema, forse?
DonkeyBanana,

Mi riferisco ad ActivatedRoute nei documenti ufficiali.
DonkeyBanana,

1
Non è necessario almeno qui, il router esporta il tipo "RouterEvent" che viene esteso dagli altri eventi del router - angular.io/api/router/RouterEvent
chrismarx

1
@chrismarx risolto
Vlad

@DonkeyBanana In realtà, se hai a che fare con moduli nidificati che contengono i loro percorsi, sì. In effetti, utilizzando moduli e router nidificati (che è anche ciò che consiglia il Team Angular) questo è l' unico modo per ottenere l'URL effettivo del percorso corrente, tutti gli altri metodi torneranno semplicemente /.
Eagerestwolf

32

Per chi lo sta ancora cercando. Su Angular 2.x ci sono alcuni modi per farlo.

constructor(private router: Router, private activatedRoute: ActivatedRoute){

   // string path from root to current route. i.e /Root/CurrentRoute
   router.url 

    // just the fragment of the current route. i.e. CurrentRoute
   activatedRoute.url.value[0].path

    // same as above with urlSegment[]
   activatedRoute.url.subscribe((url: urlSegment[])=> console.log(url[0].path))

   // same as above
   activatedRoute.snapshot.url[0].path

   // the url fragment from the parent route i.e. Root
   // since the parent is an ActivatedRoute object, you can get the same using 
   activatedRoute.parent.url.value[0].path
}

Riferimenti:

  1. https://angular.io/docs/ts/latest/api/router/index/ActivatedRoute-interface.html
  2. https://angular.io/docs/ts/latest/api/router/index/Router-class.html
  3. https://angular.io/docs/ts/latest/guide/router.html

27

Per ottenere i segmenti di percorso:

import { ActivatedRoute, UrlSegment } from '@angular/router';

constructor( route: ActivatedRoute) {}

getRoutes() { const segments: UrlSegment[] = this.route.snapshot.url; }

14

Puoi provare con

import { Router, ActivatedRoute} from '@angular/router';    

constructor(private router: Router, private activatedRoute:ActivatedRoute) {
console.log(activatedRoute.snapshot.url)  // array of states
console.log(activatedRoute.snapshot.url[0].path) }

Modi alternativi

router.location.path();   this works only in browser console. 

window.location.pathname che dà il nome del percorso.


aggiornamento: attivatoRoute.snapshot.url è un osservabile ora e devi iscriverti ad esso.
Sadok Mtir,

12

Per ottenere in modo affidabile l'intero percorso corrente è possibile utilizzare questo

this.router.events.subscribe(
  (event: any) => {
    if (event instanceof NavigationEnd) {
      console.log('this.router.url', this.router.url);
    }
  }
);

9

Anche l' windowoggetto nativo funziona bene

console.log('URL:' + window.location.href);
console.log('Path:' + window.location.pathname);
console.log('Host:' + window.location.host);
console.log('Hostname:' + window.location.hostname);
console.log('Origin:' + window.location.origin);
console.log('Port:' + window.location.port);
console.log('Search String:' + window.location.search);

NOTA: NON UTILIZZARE QUESTO NEL RENDERING LATERALE DEL SERVER


1
Fare attenzione se si utilizza il rendering lato server, questo si interromperà.
Jason Foglia,

7

versione corta se hai importato il router , puoi semplicemente usare qualcosa come

this.router.url === "/ ricerca"

altrimenti fai quanto segue

1) Importa il router

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

2) Dichiarare la sua voce nel costruttore

constructor(private router: Router) { }

3) Usa il suo valore nella tua funzione

yourFunction(){
    if(this.router.url === "/search"){
        //some logic
    }
}

La risposta di @victor mi ha aiutato, questa è la stessa sua risposta ma con un piccolo dettaglio, in quanto potrebbe aiutare qualcuno


6
import { Router } from '@angular/router';
constructor(router: Router) { 
      console.log(router.routerState.snapshot.url);
}

5

In Angular2 Rc1 è possibile iniettare RouteSegment e passarli nel metodo naviagte.

constructor(private router:Router,private segment:RouteSegment) {}

  ngOnInit() {
    this.router.navigate(["explore"],this.segment)
  }

5

Con angular 2.2.1 (in un progetto basato su angular2-webpack-starter) funziona così:

export class AppComponent {
  subscription: Subscription;
  activeUrl: string;

  constructor(public appState: AppState,
              private router: Router) {
    console.log('[app] constructor AppComponent');
  }

  ngOnInit() {
    console.log('[app] ngOnInit');
    let _this = this;
    this.subscription = this.router.events.subscribe(function (s) {
      if (s instanceof NavigationEnd) {
        _this.activeUrl = s.urlAfterRedirects;
      }
    });
  }

  ngOnDestroy() {
    console.log('[app] ngOnDestroy: ');
    this.subscription.unsubscribe();
  }
}

Nel modello di AppComponent è possibile utilizzare ad es. {{ActiveUrl}}.

Questa soluzione è ispirata al codice di RouterLinkActive.


questa è una buona risposta b / c se si dispone di un percorso jolly che reindirizza a / home event.url non è sufficiente per abbinare il percorso / home in realtà mostrerà il percorso che non esiste. event.urlAfterRedirects stamperà il percorso finale effettivo. ty.
Ian Poston Framer,

4

angolare 2 rc2

router.urlTree.contains(router.createUrlTree(['/home']))

4

Ecco cosa funziona per me in Angular 2.3.1.

location: any;

constructor(private _router: Router) { 

      _router.events.subscribe((data:any) => { this.location = data.url; });

      console.warn(this.location);  // This should print only path e.g. "/home"
}

Il dataè un oggetto e abbiamo bisogno della urlproprietà contenuta in tale oggetto. Quindi acquisiamo quel valore in una variabile e possiamo usare quella variabile anche nella nostra pagina HTML. Ad esempio, voglio mostrare un div solo quando l'utente è nella Home page. In questo caso, sarà il valore dell'URL del mio router /home. Quindi posso scrivere un div nel modo seguente:

<div *ngIf="location == '/home'">
This is content for the home page.
</div>

4

Ho avuto lo stesso problema usando

this.router.url

Ottengo il percorso corrente con parametri di query. Una soluzione alternativa che ho fatto è stato utilizzare questo invece:

this.router.url.split('?')[0]

Non è una soluzione davvero piacevole, ma utile.



4

MODO 1 : Utilizzo di Angular: this.router.url

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

// Step 1: import the router 
import { Router } from '@angular/router';

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

    //Step 2: Declare the same in the constructure.
    constructor(private router: Router) {}

    ngOnInit() {
        this.href = this.router.url;
        // Do comparision here.....
        ///////////////////////////
        console.log(this.router.url);
    }
}

MODO 2 Window.location come facciamo nel Javascript, se non vuoi usare il router

this.href= window.location.href;

3

Per i tuoi scopi puoi usare this.activatedRoute.pathFromRoot.

import {ActivatedRoute} from "@angular/router";
constructor(public activatedRoute: ActivatedRoute){

}

Con l'aiuto di pathFromRoot puoi ottenere l'elenco degli URL principali e verificare se la parte necessaria dell'URL corrisponde alla tua condizione.

Per ulteriori informazioni, consultare questo articolo http://blog.2muchcoffee.com/getting-current-state-in-angular2-router/ o installare ng2-router-helper da npm

npm install ng2-router-helper

3

Per trovare il genitore del percorso corrente, è possibile ottenere il UrlTreedal router, utilizzando i percorsi relativi:

var tree:UrlTree = router.createUrlTree(['../'], {relativeTo: route});

Quindi per ottenere i segmenti dell'outlet primario:

tree.root.children[PRIMARY_OUTLET].segments;

3

A partire da ora, sto ottenendo il mio percorso come segue -

this.router.url.subscribe(value => {
    // you may print value to see the actual object
    // console.log(JSON.stringify(value));
    this.isPreview = value[0].path === 'preview';
})

Dove, router è un'istanza diActivatedRoute


3

router.events.subscribe(e => {
      if (e instanceof NavigationEnd) {
        this.currentUrl = e.url;
      }
    });


3
import { Router, NavigationEnd } from "@angular/router";

constructor(private router: Router) {
  // Detect current route
  router.events.subscribe(val => {
    if (val instanceof NavigationEnd) {
      console.log(val.url);
    }
});

2

questo è semplice, in Angular 2 devi solo importare la libreria Router in questo modo:

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

Quindi nel costruttore del componente o del servizio è necessario creare un'istanza in questo modo:

constructor(private _router: Router) {}

Quindi in qualsiasi parte del codice, in una funzione, metodo, costrutto, qualunque cosa:

      this._router.events
        .subscribe(
            (url:any) => {
                let _ruta = "";
                url.url.split("/").forEach(element => {
                    if(element!=="" && _ruta==="")
                        _ruta="/"+element;  
                });
                console.log("route: "+_ruta); //<<<---- Root path
                console.log("to URL:"+url.url); //<<<---- Destination URL                    
                console.log("from URL:"+this._router.url);//<<<---- Current URL
            }); 

2

È possibile utilizzare nel file .ts

import { Route, Router, NavigationStart } from '@angular/router';

constructor(private router: Router) {}

this.router.events.subscribe(value => {
      if (value instanceof NavigationStart) {
        console.log(value) // your current route
      }
    });

1

questa potrebbe essere la tua risposta, usa il metodo params della route attivata per ottenere i parametri dall'URL / route che vuoi leggere, sotto è lo snippet demo

import {ActivatedRoute} from '@angular/router'; 
@Component({
})
export class Test{
constructor(private route: ActivatedRoute){
this.route.params.subscribe(params => {
             this.yourVariable = params['required_param_name'];
        });
    }
}

1
this.router.events.subscribe((val) => {
   const currentPage = this.router.url; // Current page route
  const currentLocation = (this.platformLocation as any).location.href; // Current page url
});

1

Se devi accedere all'URL corrente, di solito devi attendere che NavigationEnd o NavigationStart facciano qualcosa. Se ti iscrivi agli eventi del router, l'abbonamento genererà molti eventi nel ciclo di vita del percorso. Invece, usa un operatore RxJS per filtrare solo l'evento che ti serve. L'effetto collaterale benefico di questo è che ora abbiamo tipi più severi!

constructor(private router: Router) {
    router.events.pipe(
      filter(ev => (ev instanceof NavigationEnd))
    ).subscribe((ev: NavigationEnd) => {
      console.log(ev.url);
    });
}


1

Stavo affrontando il problema in cui avevo bisogno del percorso dell'URL quando l'utente stava navigando nell'app o accedendo a un URL (o aggiornando un URL specifico) per visualizzare i componenti figlio in base all'URL.

Inoltre , voglio un osservabile che può essere consumato nel modello, quindi router.url non era un'opzione. Né abbonamento router.events perché il routing viene attivato prima dell'inizializzazione del modello del componente.

this.currentRouteURL$ = this.router.events.pipe(
     startWith(this.router),
     filter(
         (event) => event instanceof NavigationEnd || event instanceof Router
     ),
     map((event: NavigationEnd | Router) => event.url)
);

Spero che ti aiuti, buona fortuna!


1
Questo è bellissimo.
codeepic
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.