현재 경로를 얻는 방법


469

현재 문서는 실제 경로 세그먼트가 아닌 경로 매개 변수를 얻는 것에 대해서만 이야기합니다.

예를 들어 현재 경로의 부모를 찾으려면 어떻게 가능합니까?


25
window.location.pathname
dchacke

1
@dchacke의 문제점 window.location은 미래에 서버 측 렌더링을 구현하려는 window경우 Node.js 서버에 존재하지 않기 때문에 약간의 어려움에 직면 하지만 경로에 액세스하기 위해 Angular 표준 방법을 사용해야한다는 것입니다 서버와 브라우저 모두에서 괜찮을 것입니다.
모하마드 케르 마니

그래요 서버 측 렌더링을 사용하거나 사용하려는 경우이 점을 고려해야합니다.
dchacke

답변:


520

새로운 V3 라우터에는 url 속성이 있습니다.

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

5
이 코드를 사용하고 문자열 변수 에이 URL을 가져오고 있지만 콘솔 .log에서 인쇄하려고하면 this.fullUrl = this.router.url console.log (this.fullUrl); // 인쇄하지 않음
vijay gupta

3
새로운 라우터 활성 기능 <a routerLink="/dashboard" routerLinkActive="active"> 대시 보드 </a> 사용
Victor96

34
이것은 해시 전략으로 탐색 할 때 쓸모가 없습니다. URL은 항상 "/"입니다
Ninja Coding

5
@NinjaCoding 해시 전략을 사용하고 있으며 "/"만 받고 있습니다. 해시로 경로 URL을 얻으려면 어떻게해야합니까?
Murtuza

9
@Murtuza는 여기 해결책입니다 : this.router.events.filter((event: any) => event instanceof NavigationEnd).subscribe(event => { console.log('this is what your looking for ', event.url); });. 수입 확인import { Router, NavigationEnd } from '@angular/router';
Gel

159

각도 RC4 :

Router에서 가져올 수 있습니다@angular/router

그런 다음 주입하십시오.

constructor(private router: Router ) {

}

그런 다음 URL 매개 변수를 호출하십시오.

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

2
라우터 자체를 가져 오는 방법에 대한 명확한 설명이 매우 유용합니다. 사용자 정의 라우터를 사용하는 경우 다른 것인지 명확히 할 수 있습니까?
kbpontius

1
그것은 분명히 사용자 정의 라우터의 '사용자 정의'에 달려 있습니다. (죄송합니다. 이것은 특별히 도움이되지 않은 의견이 아닙니다. 특정한 질문이 있다면, 새로운 질문을하고이 답변을 참조 할 것을 제안합니다)
lowcrawler

41
이 솔루션을 사용했지만 항상 "/"를 얻습니다. 아무도 이유를 알고 있습니까?
Marcio M.

4
Angular Dependency Injection은 TypeScript sugar 구문을 사용하므로 생성자 서명에서 private _router : Router를 선언하면 Router가 주입 된 현재 클래스 인스턴스에 _router 속성이 자동으로 생성됩니다. 이 문장은 this.router = _router; 동일한 객체 인스턴스 (이 경우 라우터)에 대한 두 개의 참조가 있기 때문에 나에게 오버 헤드입니다.
Andrew Reborn

1
@Marcio M. URL이 다르게 표시 되더라도 라우터가 실제로 해당 상태에 도달하지 않았기 때문일 수 있습니다. 예를 들어, 가드 서비스에서 router.url을 보면. 답변에 언급 된 location.path ()는 라우터 상태에 관계없이 URL을 제공합니다.
Daniel van Niekerk

61

Location컴포넌트에 주입 하고 읽습니다 . Angular가 해결할 수 있도록 어딘가에 location.path(); 추가해야합니다 . ROUTER_DIRECTIVESLocationimport: [RouterModule]모듈 에 추가 해야합니다.

최신 정보

V3 (RC.3) 라우터에서는 ActivatedRoute해당 snapshot특성을 사용하여 자세한 정보를 주입 하고 액세스 할 수 있습니다 .

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

또는

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

참조 각도 2 라우터 이벤트 리스너를


3
그것은 'url'경로를 제공합니다. '경로 이름' navigate을 찾으려면 탐색하려는 자식 경로의 (추가) 이름과 함께 메소드 에 배열로 전달할 수 있습니다 .
pdeva

내가 참조. 나는 또한 이것도 만족스럽지 않다. 나는 그것을 직접 시도하지는 않았지만 stackoverflow.com/a/34548656/217408에MyTrackingService 설명 된 것처럼 이 값에 액세스 할 수 있습니다.
Günter Zöchbauer

경로 이름이 사라졌습니다.
Günter Zöchbauer 2016 년

4
@GunterZochbauer 활성화 하기 전에 요청한 경로 를 얻는 방법이 있습니까? 예를 들어, 요청 된 경로를 메소드 내에 저장하려면 "로그인"페이지로 리디렉션 한 다음 사용자가 인증 한 후 원래 경로로 다시 리디렉션 할 수 있습니까? canActivate()
예브게니 아나 닌

1
canActivate 가드로 그렇게 할 수 없습니까?
Günter Zöchbauer

42

새 라우터의 경우> = RC.3

이 작업을 수행하는 가장 좋고 간단한 방법입니다!

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

이 답변은 lowcrawler와 어떻게 다릅니 까?
not2savvy

1
@ not2savvy는 라우터 이벤트 리스너를 통해 동일한 것을 찾는 방법을 하나 더 제공하여 일부 사람들이 원하는 것을 찾는 데 도움이되었습니다.
Rajath MS

36

이것을 사용하십시오

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

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

그리고 main.ts수입

import 'rxjs/add/operator/filter';

편집하다

현대적인 방법

import {filter} from 'rxjs/operators';

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

10
현재 URL이 가리키는 위치를 확인하는 것만 큼 간단한 작업을 수행하는 것이 실제로 권장되는 방법입니까? 나는 이것에 대해 당신을 반대하지 않습니다. 그러나 라우팅이 많은 변경, 업데이트, 혼란 등의 원인이라는 것을 알았습니다. ActivatedRoute 가 주로 라우터가 아닌이 용도로 사용될 것으로 기대했습니다 . 아마도 문제의 복잡성을 놓치고 있습니까?
DonkeyBanana

공식 문서에서 ActivatedRoute 를 참조하고 있습니다.
DonkeyBanana

1
어떤 필요 없음 여기 적어도, 라우터 수출 다른 라우터 이벤트에 의해 확장 된 "RouterEvent"유형 - angular.io/api/router/RouterEvent
chrismarx

1
@ chrismarx 수정
Vlad

@DonkeyBanana 사실, 자체 경로가 포함 된 중첩 모듈을 다루는 경우에는 그렇습니다. 실제로 중첩 모듈과 라우터 (Angular 팀이 권장하는 것) 를 사용하면 현재 경로의 실제 URL을 얻는 유일한 방법이며 다른 모든 방법은 단순히을 반환 /합니다.
Eagerestwolf

32

아직도 이것을 찾는 사람들을 위해. Angular 2.x에는 몇 가지 방법이 있습니다.

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
}

참고 문헌 :

  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

경로 세그먼트를 얻으려면

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

constructor( route: ActivatedRoute) {}

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

14

당신은 시도 할 수 있습니다

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

대체 방법

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

window.location.pathname 경로 이름을 제공합니다.


업데이트 : enabledRoute.snapshot.url은 이제 Observable이며 구독해야합니다.
Sadok Mtir

12

전체 현재 경로를 안정적으로 얻으려면 이것을 사용할 수 있습니다

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

9

기본 window객체도 잘 작동합니다

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

참고 : 서버 측 렌더링에서이 기능을 사용하지 마십시오


1
서버 측 렌더링을 사용하는 경우주의하십시오.
Jason Foglia 2

7

라우터를 가져온 경우 짧은 버전을 사용하면 다음과 같은 것을 사용할 수 있습니다.

this.router.url === "/ search"

그렇지 않으면 다음을 수행

1) 라우터 가져 오기

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

2) 생성자에 항목을 선언하십시오.

constructor(private router: Router) { }

3) 함수에 값을 사용하십시오.

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

@ 빅터 답변이 저에게 도움이되었습니다.


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

5

Angular2 Rc1에서는 RouteSegment를 주입하고 naviagte 메소드로 전달할 수 있습니다.

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

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

5

angular 2.2.1 (angular2-webpack-starter 기반 프로젝트)을 사용하면 다음과 같이 작동합니다.

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();
  }
}

AppComponent의 템플릿에서 {{activeUrl}}을 사용할 수 있습니다.

이 솔루션은 RouterLinkActive의 코드에서 영감을 얻었습니다.


/ home event.url로 다시 리디렉션되는 와일드 카드 경로가 / home 경로와 일치하기에 충분하지 않으면 실제로 존재하지 않는 경로를 표시합니다. event.urlAfterRedirects는 실제 종료 경로를 인쇄합니다. 타이.
Ian Poston Framer

4

각도 2 rc2

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

4

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

data객체이며, 우리가 필요로 url그 객체에 포함 된 속성을. 따라서 변수에서 해당 값을 캡처하고 HTML 페이지에서도 해당 변수를 사용할 수 있습니다. 예를 들어 사용자가 홈페이지에있을 때만 div를 표시하고 싶습니다. 이 경우 내 라우터 URL 값은입니다 /home. 그래서 다음과 같은 방법으로 div를 작성할 수 있습니다.

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

4

나는 같은 문제를 겪었다.

this.router.url

쿼리 매개 변수가있는 현재 경로를 얻습니다. 내가 한 해결 방법은 이것을 대신 사용하는 것입니다.

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

정말 좋은 해결책은 아니지만 도움이됩니다.


4

ActivatedRoute현재 라우터를 얻는 데 사용할 수 있습니다

원래 답변 (RC 버전의 경우)

AngularJS Google 그룹 에서 솔루션을 찾았는데 너무 쉽습니다!

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

여기에 원래 답변이 있습니다

https://groups.google.com/d/msg/angular/wn1h0JPrF48/zl1sHJxbCQAJ


url더 이상 URL과 문자열이 아니라 a 이므로 rc.2부터 변경되었습니다 ComponentInstruction.
Martin C.

4

WAY 1 : 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);
    }
}

WAY 2 Java.에서와 같이 Window.location, 라우터를 사용하지 않으려는 경우

this.href= window.location.href;

3

당신의 목적을 위해 사용할 수 있습니다 this.activatedRoute.pathFromRoot.

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

}

pathFromRoot를 사용하면 상위 URL 목록을 가져 와서 URL의 필요한 부분이 조건과 일치하는지 확인할 수 있습니다.

자세한 내용은이 기사 http://blog.2muchcoffee.com/getting-current-state-in-angular2-router/ 를 확인 하거나 npm에서 ng2-router-helper를 설치 하십시오

npm install ng2-router-helper

3

현재 라우트의 상위를 찾으려면 UrlTree상대 라우트를 사용하여 라우터에서을 얻을 수 있습니다 .

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

그런 다음 기본 콘센트의 세그먼트를 가져옵니다.

tree.root.children[PRIMARY_OUTLET].segments;

3

현재로서는 다음과 같이 경로를 얻고 있습니다.

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';
})

경우, router인스턴스이다ActivatedRoute



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

이것은 각도 2에서 라우터 라이브러리를 다음과 같이 가져 오기만하면됩니다 .

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

그런 다음 컴포넌트 또는 서비스의 생성자에서 다음과 같이 인스턴스화해야합니다.

constructor(private _router: Router) {}

그런 다음 코드의 어느 부분에서나 함수, 메서드, 구문 등

      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

.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

이것은 답이 될 수 있습니다. 활성화 된 경로의 params 방법을 사용하여 읽으려는 URL / 경로에서 매개 변수를 얻으십시오. 아래는 데모 스 니펫입니다.

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

현재 URL에 액세스해야하는 경우 일반적으로 NavigationEnd 또는 NavigationStart가 무언가를 수행 할 때까지 기다려야합니다. 라우터 이벤트 만 구독하면 구독은 경로 수명주기에 많은 이벤트를 출력합니다. 대신 RxJS 연산자를 사용하여 필요한 이벤트 만 필터링하십시오. 이것의 유익한 부작용은 이제 더 엄격한 유형입니다!

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


1

사용자가 앱을 탐색 하거나 URL에 액세스 할 때 URL 경로가 필요한 문제에 직면했습니다. 기반으로 하위 구성 요소를 표시 하거나 특정 URL을 새로 고칠 .

또한 템플릿에서 사용할 수있는 Observable을 원하므로 router.url 은 옵션이 아닙니다. 도 아니다 router.events는 구성 요소의 템플릿이 초기화되기 전에 라우팅 해고되기 때문에 가입이 필요합니다.

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

도움이 되길 바랍니다. 행운을 빌어 요!


1
대단해.
codeepic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.