如何获得当前路线


469

当前文档仅讨论获取路径参数,而不是实际的路径段。

例如,如果我想找到当前路线的父级,那怎么可能?


25
window.location.pathname
dchacke 2016年

1
@dchacke的问题window.location是,如果将来他们希望实现服务器端渲染,则将面临一些困难,因为windowNode.js服务器上不存在该问题,但是他们需要使用Angular标准方法来访问路由。而且在服务器和浏览器上都可以。
Mohammad Kermani

是的,很有道理。使用或计划使用服务器端渲染的用户应考虑到这一点。
dchacke

Answers:


520

新的V3路由器具有url属性。

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

5
我使用此代码,并在字符串变量中获取此url,但是当我尝试在console.log中打印时,它未打印this.fullUrl = this.router.url console.log(this.fullUrl); //不打印
维杰-古普塔

3
看一下使用新的路由器活动功能<a routerLink="/dashboard" routerLinkActive="active">仪表板</a>
Victor96's

34
当您使用哈希策略进行导航时,这是没有用的,URL始终为“ /”
Ninja Coding

5
@NinjaCoding我正在使用哈希策略,但得到的只是“ /”。如何使用Hash获取路线网址?
Murtuza '18

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语法,因此当您声明私有_router:构造函数签名中的Router时,将在当前类实例中自动创建_router属性,并注入Router。这条语句this.router = _router; 这对我来说只是一个开销,因为您将有两个对同一个对象实例的引用(在这种情况下为Router)。
安德鲁·里伯恩

1
@MarcioM。这可能是因为路由器实际上并未达到该状态,即使URL显示不同。例如,如果您在防护服务中查看router.url。答案中提到的location.path()将为您提供URL,无论路由器状态如何。
丹尼尔·范·尼克尔

61

注入Location您的组件并阅读location.path(); 您需要在ROUTER_DIRECTIVES某个地方添加以便Angular可以解析Location您需要添加import: [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

我知道了。我也不满意。我自己没有尝试过,但也许stackoverflow.com/a/34548656/217408中MyTrackingService解释将允许访问这些值。
君特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"
}

这个答案与lowcrawler的答案有何不同?
not2savvy

1
@ not2savvy提供了另一种通过路由器事件侦听器查找相同内容的方法,该方法帮助某些人找到了他们想要的东西。
拉贾斯MS'S

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
DonkeyBanana

1
至少不需要这里,路由器会导出由其他路由器事件扩展的“ RouterEvent”类型-angular.io/api/router/RouterEvent
chrismarx

1
@chrismarx固定
维拉德

@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 给出路径名。


更新:activatedRoute.snapshot.url现在是可观察的,您必须订阅它。
Sadok Mtir


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 ===“ /搜索”

否则请执行以下操作

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的通配符路由,这是一个很好的答案。URL不足以匹配/ home路由,它将实际显示不存在的路由。event.urlAfterRedirects将打印实际的结束路线。ty。
伊恩·波斯顿

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。在这种情况下,我的路由器网址值为/home。因此,我可以通过以下方式编写div:

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

4

我在使用时遇到了同样的问题

this.router.url

我使用查询参数获取当前路线。我所做的解决方法是改用此方法:

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

这不是一个很好的解决方案,但很有帮助。



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

哪里routerActivatedRoute



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

这很简单,在angular 2中,您只需要像这样导入Router库:

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.