現在のルートを取得する方法


471

現在のドキュメントでは、実際のルートセグメントではなく、ルートパラメータの取得についてのみ説明しています。

たとえば、現在のルートの親を見つけたい場合、どうすれば可能ですか?


25
window.location.pathname
dchacke

1
@dchackeの問題window.locationは、将来的にサーバー側のレンダリングを実装したいwindow場合、Node.jsサーバーには存在しないため、いくつかの問題に直面することになりますが、ルートにアクセスするにはAngular標準メソッドを使用する必要がありますサーバーとブラウザの両方で問題ありません。
Mohammad Kermani

ええ、理にかなっています。サーバー側のレンダリングを使用している、または使用を計画している場合は、これを考慮に入れる必要があります。
dchacke

回答:


523

新しい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"> Dashboard </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

160

Angular RC4:

Routerからインポートできます@angular/router

次に、それを注入します。

constructor(private router: Router ) {

}

次に、URLパラメータを呼び出します。

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

2
ルータ自体をインポートする方法についての明確さは非常に役立ちます。カスタムルーターを使用している場合と異なるかどうかを明確にできますか?
kbpontius 2017年

1
それは確かにカスタムルーターの「カスタム性」に依存します。(申し訳ありませんが、これは特に役立つコメントではありませんでした。具体的な質問がある場合は、新しい質問を作成してこの回答を参照することをお勧めします)
ロークローラー

42
このソリューションを使用しましたが、常に "/"を取得しました。なぜ誰か知っていますか?
Marcio M.17年

4
Angular Dependency InjectionはTypeScriptシュガー構文に依存しているため、コンストラクターのシグニチャーでprivate _router:Routerを宣言すると、ルーターが挿入された現在のクラスインスタンスにプロパティ_routerが自動的に作成されます。このステートメントthis.router = _router; 同じオブジェクトインスタンス(この場合はルーター)への2つの参照があるため、私にとっては単なるオーバーヘッドです。
アンドリューリボーン

1
@Marcio M. URLが異なっていても、実際にはルーターがその状態に達していないことが原因である可能性があります。たとえば、ガードサービスのrouter.urlを確認するとします。回答に記載されているlocation.path()は、ルーターの状態に関係なく、URLを提供します。
ダニエルファンニーカーク2018年

61

Locationコンポーネントにインジェクトして読んでくださいAngularが解決できるようlocation.path(); に、ROUTER_DIRECTIVESどこかに追加する必要がありますLocationimport: [RouterModule]モジュールに追加する必要があります。

更新

V3(RC.3)ルーターでActivatedRouteは、そのsnapshotプロパティを使用して、詳細を挿入してアクセスできます。

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

または

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

Angular 2ルーターイベントリスナーもご覧ください


3
それは私に「URL」パスを与えます。どのように「ルート名」を見つけて、navigateナビゲートしたい子ルートの(追加された)名前とともにメソッドにそれらを配列で渡すことができますか
pdeva

そうですか。これも満足できるものではありません。私自身は試していませんがMyTrackingServicestackoverflow.com / a / 34548656/217408で説明されているようにこれらの値にアクセスできます。
ギュンターZöchbauer

ルート名はなくなりました。
ギュンターZöchbauer

4
@GunterZochbauerがアクティブになるに、要求されたルートを取得する方法はありますか?たとえば、リクエストされたルートをメソッド内に保存して、「ログイン」ページにリダイレクトしてからリダイレクトできるようにする場合canActivate()バックユーザーが認証した後、元のルートに?
Yevgeny Ananin 16

1
canActivateガードでそれを行うことはできませんか?
ギュンター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"
}

この回答はロークローラーの回答とどう違うのですか?
not2savvy

1
@ not2savvyは、ルーターイベントリスナーを介して同じことを見つけるためのもう1つの方法を提供しました。
Rajath MS、2017

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は主にRouterではなく、これに使用されることを期待していました。問題の複雑さを見逃しているのでしょうか?
DonkeyBanana

私は公式ドキュメントでActivatedRouteを参照しています。
ドンキーバナナ

1
少なくともここでは必要ありません。ルーターは、他のルーターイベント(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 パス名を指定します。


update:activatedRoute.snapshot.urlは現在Observableであり、それにサブスクライブする必要があります。
Sadok Mtir 2017年

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
サーバー側レンダリングを使用している場合は注意してください。これは機能しなくなります。
ジェイソンフォリア

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

@victorの回答は私を助けました、これは彼と同じ回答ですが、誰かを助けるかもしれないので、少し詳細です


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は実際の終了ルートを出力します。ty。
Ian Poston Framer


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 Groupで解決策を見つけました。とても簡単です。

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

これが元の答えです

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


rc.2から変更されurlました。URLと文字列ではなく、になりましたComponentInstruction
マーティンC.

4

方法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 Window.location(Javascriptで行うように、ルーターを使用したくない場合)

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

これは簡単です。angular2では、次のようにルーターライブラリをインポートするだけです。

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で更新するとき)に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.