如何获得当前路线

时间:2016-01-04 18:51:28

标签: angular angular2-routing

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

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

38 个答案:

答案 0 :(得分:344)

新的V3路由器有一个url属性。

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

答案 1 :(得分:107)

Angular RC4:

您可以从Router

导入@angular/router

然后注入它:

constructor(private router: Router ) {

}

然后调用它的URL参数:

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

答案 2 :(得分:49)

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 router event listener

答案 3 :(得分:36)

新路由器的

&gt; = 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"
}

答案 4 :(得分:24)

对于那些仍在寻找此事的人。在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

答案 5 :(得分:24)

获取路段:

*
!.gitignore
!*.c
!*/

答案 6 :(得分:17)

使用此

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

constructor(private router: Router) {
    router.events.filter((event: any) => 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: any) => event instanceof NavigationEnd)
)
    .subscribe(event => {
        console.log(event);
    });

答案 7 :(得分:10)

要可靠地获取完整的当前路线,您可以使用此

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

答案 8 :(得分:10)

您可以尝试使用

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,它给出了路径名称。

答案 9 :(得分: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);

注意:请勿在服务器端RENDERING中使用

答案 10 :(得分:6)

简短版本(如果您导入了路由器),则可以简单地使用

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的答案对我有所帮助,这与他的答案相同,但有一点细节,因为它可能会帮助某人

答案 11 :(得分:5)

在Angular2 Rc1中,您可以注入RouteSegment并以naviagte方法传递它们。

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

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

答案 12 :(得分:5)

使用角度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的代码。

答案 13 :(得分:4)

我使用

遇到了同样的问题
this.router.url

我使用查询参数获取当前路径。我做的一个解决方法是使用它:

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

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

答案 14 :(得分:4)

以下是Angular 2.3.1中为我工作的内容。

File

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属性。因此,我们在变量中捕获该值,我们也可以在HTML页面中使用该变量。例如,我想只在用户在主页上时显示div。在这种情况下,我的路由器网址值将为url。所以我可以用以下方式写一个div:

/home

答案 15 :(得分:4)

angular 2 rc2

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

答案 16 :(得分:3)

要查找当前路由的父节点,可以使用相对路由从路由器获取UrlTree

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

然后获得主要出口的部分:

tree.root.children[PRIMARY_OUTLET].segments;

答案 17 :(得分:3)

出于您的目的,您可以使用this.activatedRoute.pathFromRoot

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

}

在pathFromRoot的帮助下,您可以获取父网址列表,并检查网址所需的部分是否符合您的条件。

有关其他信息,请查看此文http://blog.2muchcoffee.com/getting-current-state-in-angular2-router/ 或者从npm

安装ng2-router-helper
npm install ng2-router-helper

答案 18 :(得分:3)

您可以使用ActivatedRoute获取当前路由器

原始答案(适用于RC版)

我在AngularJS Google Group找到了一个解决方案,这很简单!

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

这是原始答案

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

答案 19 :(得分: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

的实例

答案 20 :(得分:3)

如果您无法访问router.url(例如,如果您使用skipLocationChange),则可以使用以下更简单的方法:

doWork()

答案 21 :(得分: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
            }); 

答案 22 :(得分:2)

  

方法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;

答案 23 :(得分:2)

如果您将其与authguard一起使用,则适用

this.router.events.subscribe(event => {
        if(event instanceof NavigationStart){
            console.log('this is what your looking for ', event.url);  
         }
       } 
   );

答案 24 :(得分: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
});

答案 25 :(得分:1)

最简单的方法

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

答案 26 :(得分:1)

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

答案 27 :(得分:1)

您可以在.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
      }
    });

答案 28 :(得分:1)

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

答案 29 :(得分: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)
);

希望有帮助,祝您好运!

答案 30 :(得分:1)

如果您需要访问当前的URL,通常必须等待NavigationEnd或NavigationStart做一些事情。如果您仅订阅路由器事件,则订阅将在路由生命周期中输出许多事件。而是使用RxJS运算符仅过滤所需的事件。这样做的好处是现在我们有了更严格的类型!

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

答案 31 :(得分: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'];
        });
    }
}

答案 32 :(得分:0)

import {ActivatedRoute} from '@angular/router';
constructor(private route:ActivatedRoute){
    console.log(this.route.routeConfig.path);
}

答案 33 :(得分:0)

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

答案 34 :(得分:0)

在组件文件中:

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

constructor(state: ActivatedRouteSnapshot) {
    console.log(state.path)
}

在路由文件中:

enter image description here

答案 35 :(得分:0)

要使当前路由器的角度为8,只需执行此操作

从'@ angular / router'导入{ActivatedRoute};

然后将其注入合同商中,如constract(private route:ActivatedRoute){}

如果要获取当前路线,请使用此route.url

如果您具有多名名称路由(例如/ home / pages / list)并且希望访问个人

然后您就可以像下面这样访问每个route.url.value [0] .path

值[0]将赋予主页值[1]将为您提供页面,值[2]将为您提供列表

答案 36 :(得分:0)

这个是在 Angular 11 上测试的

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

}

答案 37 :(得分:0)

对我来说,在 AuthGuardService implements CanActivate 内访问当前路线时,接受的答案不起作用,因为该路线尚未完全处理。我在这里 (https://stackoverflow.com/a/68541653/1479486) 回答了同样的问题,但如果您只想从这里复制粘贴,这是我的解决方案:

const finalUrl = this.router.getCurrentNavigation()?.finalUrl;   
const isLoginPage = finalUrl?.root.children['primary'].segments[0]?.path === 'login';