ChatGPT解决这个技术问题 Extra ChatGPT

如何获取当前路线

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

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

window.location.pathname
@dhacke window.location 的问题是,如果将来他们想要实现服务器端渲染,他们将面临一些困难,因为 Node.js 服务器上不存在 window,但他们需要使用 Angular访问路由的标准方法,它们在服务器和浏览器上都可以。
是的,有道理。那些使用或计划使用服务器端渲染的人应该考虑到这一点。

V
Victor96

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

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

我使用此代码,并且在字符串变量中获取此 url,但是当我尝试在控制台 .log 中打印时,它没有打印 this.fullUrl = this.router.url console.log(this.fullUrl); // 不打印
当您使用 Hash 策略导航时,这是没用的,url 始终是“/”
@NinjaCoding 我正在使用哈希策略,我得到的只是“/”。如何使用 Hash 获取路由 url?
@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';
@Murtuza 为我指明了正确的方向。但是,不需要过滤,只需监听 NavigationEnd this.router.events.subscribe((event) => { event instanceof NavigationEnd ? console.log(event): null })
R
Rafique Mohammed

角RC4:

您可以从 @angular/router 导入 Router

然后注入它:

constructor(private router: Router ) {

}

然后调用它的 URL 参数:

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

关于如何导入路由器本身的额外说明非常有帮助。如果您使用自定义路由器,您能否澄清一下是否会有所不同?
那肯定取决于自定义路由器的“自定义”。 (对不起,这不是一个特别有用的评论——如果你有一个具体的问题,我建议你提出一个新问题并参考这个答案)
我使用了这个解决方案,但我总是得到这个“/”。有谁知道为什么?
Angular Dependency Injection 依赖于 TypeScript 糖语法,因此当您在构造函数签名中声明 private _router: Router 时,会在当前类实例中自动创建一个属性 _router 并注入 Router。这条语句 this.router = _router;对我来说只是一个开销,因为你有两个对同一个对象实例(在这种情况下是路由器)的引用。
@Marcio M。这可能是因为路由器实际上尚未达到该状态,即使 URL 显示不同。例如,如果您查看保护服务中的 router.url。答案中提到的 location.path() 将为您提供 url,无论路由器状态如何。
G
Günter Zöchbauer

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


这给了我'url'路径。我如何找到“路线名称”,以便我可以将它们与我想要导航到的子路线的(附加)名称一起以数组形式传递给 navigate 方法。
我懂了。我也不觉得这令人满意。我自己没有尝试过,但可能 stackoverflow.com/a/34548656/217408 中解释的 MyTrackingService 将允许访问这些值。
路线名称现在消失了。
@GunterZochbauer 有没有办法让 requested 路由 before 被激活?例如,如果我想将 requested 路由存储在 canActivate() 方法中,以便我可以重定向到“登录”页面,然后将 back 重定向到用户认证后的原始路由?
你不能用 canActivate 守卫做到这一点吗?
V
Vlad

用这个

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

这真的是推荐的方法来做一些简单的事情,比如检查当前 URL 指向的位置吗?我不是在这个问题上反对你。但是,我注意到路由是许多变化、更新、混乱等的根源。我有点期待 ActivatedRoute 将主要用于此,而不是路由器。也许我错过了问题的复杂性?
至少在这里不需要,路由器导出由其他路由器事件扩展的“RouterEvent”类型 - angular.io/api/router/RouterEvent
@chrismarx 已修复
这很好用。但是当我启动应用程序时,第一次没有触发任何事件。这在路线改变时有效
@SunilGarg 您可以使用 startsWith rxjs 运算符 startWith(this.router.url),
S
Severin Klug

对于那些仍在寻找这个的人。在 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
}

参考:

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


R
Rajath M S

对于新路由器 >= 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 提供了另一种通过路由器事件侦听器找出相同内容的方法,这有助于一些人找到他们正在寻找的东西。
t
ttugates

要获取路线段:

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

constructor( route: ActivatedRoute) {}

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

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

哈利路亚! :) 谢谢!
A
Andrei Diaconescu

为了可靠地获得完整的当前路线,您可以使用它

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

这应该是正确的答案,因为如果你改变路线,这会抓住它。
J
Jose G Varanam

你可以试试

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 现在是一个 Observable,你必须订阅它。
S
Sanket Berde

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

注意:不要在服务器端渲染中使用它


如果您使用服务器端渲染,请小心,这会中断。
Y
Yohan Dahmani

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

import { Location } from '@angular/common';    
constructor(private readonly location: Location) {}
    
ngOnInit(): void {
  console.log(this.location.path());
}

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

A
Ant T.

我有同样的问题使用

this.router.url

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

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

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


M
Mateen

短版本,如果您导入了路由器,那么您可以简单地使用类似的东西

this.router.url === "/搜索"

否则执行以下操作

1)导入路由器

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

2) 在构造函数中声明其条目

constructor(private router: Router) { }

3) 在你的函数中使用它的值

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

@victor 回答对我有帮助,这与他的回答相同,但有一点细节,因为它可能对某人有所帮助


S
Steve Nginyo

如果您将它与 authguard 一起使用,这适用

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

A
Adrian

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


这是一个很好的答案 b/c 如果您有一个重定向回 /home event.url 的通配符路由不足以匹配 /home 路由,它实际上会显示不存在的路由。 event.urlAfterRedirects 将打印实际的结束路线。泰。
H
Hans

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

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

然后将其注入构造函数中

constructor(private route: ActivatedRoute){}

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

如果您有像 /home/pages/list 这样的多重名称路由并且您想访问个人,那么您可以像这样访问每个 route.url.value[0].path

value[0] 提供主页,value[1] 提供页面,value[2] 提供列表


ActivatedRoute 中的 url 是一个 BehaviorSubject,所以需要使用 this.route.value
T
Trilok Pathak

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

方式 2 Window.location 就像我们在 Javascript 中所做的那样,如果您不想使用路由器

this.href= window.location.href;

C
Chirag

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

N
Naeem Bashir

最简单的方法

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

n
nadav

角2 rc2

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

D
Devner

这是 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>

K
Khaled Al-Ansari

您可以使用 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
M
Manoj Manu M

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


M
Martin Zeitler

在 Angular2 Rc1 中,您可以注入一个 RouteSegment,然后将其传递给 .navigate() 方法:

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

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

N
Nikolay Kostov

出于您的目的,您可以使用 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

e
eberlast

这很简单,在 Angular 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
            }); 

p
pixelbits

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

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

然后获取主要出口的段:

tree.root.children[PRIMARY_OUTLET].segments;

T
Tushar Walzade

截至目前,我的路径如下 -

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 的一个实例