วิธีรับเส้นทางปัจจุบัน


469

เอกสารปัจจุบันพูดคุยเกี่ยวกับการรับพารามิเตอร์เส้นทางเท่านั้นไม่ใช่ส่วนของเส้นทางที่แท้จริง

ตัวอย่างเช่นหากฉันต้องการค้นหาพาเรนต์ของเส้นทางปัจจุบันเป็นไปได้อย่างไร?


25
window.location.pathname
dchacke

1
@dacke ปัญหาwindow.locationคือถ้าในอนาคตพวกเขาต้องการที่จะใช้การเรนเดอร์ฝั่งเซิร์ฟเวอร์พวกเขาจะเผชิญกับความยากลำบากเนื่องจากwindowไม่มีอยู่บนเซิร์ฟเวอร์ Node.js แต่พวกเขาจำเป็นต้องใช้วิธีมาตรฐานเชิงมุมในการเข้าถึงเส้นทาง และจะใช้ได้ทั้งบนเซิร์ฟเวอร์และเบราว์เซอร์
Mohammad Kermani

ใช่เหมาะสมแล้ว ผู้ที่ใช้หรือวางแผนที่จะใช้การเรนเดอร์ฝั่งเซิร์ฟเวอร์ควรพิจารณาสิ่งนี้
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 จะอยู่เสมอ "/"
เข้ารหัสนินจา

5
@NinjaCoding ฉันใช้กลยุทธ์แฮชและฉันได้รับแค่ "/" ฉันจะดู URL เส้นทางด้วย Hash ได้อย่างไร
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
แน่นอนว่าจะขึ้นอยู่กับ 'Custom-Ness' ของเราเตอร์ที่กำหนดเอง (ขออภัยนี่ไม่ใช่ความคิดเห็นที่เป็นประโยชน์โดยเฉพาะ - หากคุณมีคำถามเฉพาะฉันขอแนะนำให้สร้างคำถามใหม่และอ้างอิงคำตอบนี้)
lowcrawler

41
ฉันใช้โซลูชันนี้ แต่ได้รับ "/" นี้เสมอ ไม่มีใครรู้ว่าทำไม
Marcio M.

4
Angular Dependency Injection อาศัยไวยากรณ์น้ำตาล TypeScript ดังนั้นเมื่อคุณประกาศ _router ส่วนตัว: เราเตอร์ในลายเซ็นคอนสตรัคเตอร์ _router คุณสมบัติจะถูกสร้างขึ้นโดยอัตโนมัติในอินสแตนซ์คลาสปัจจุบันที่มีการฉีดเราเตอร์ ข้อความนี้ this.router = _router; เป็นเพียงค่าใช้จ่ายสำหรับฉันเนื่องจากคุณมีสองอ้างอิงถึงอินสแตนซ์ของวัตถุเดียวกัน (ในกรณีนี้คือเราเตอร์)
Andrew Reborn

1
@Marcio M. อาจเป็นเพราะเราเตอร์ยังไม่ถึงสถานะนั้นแม้ว่า URL จะแสดงแตกต่างกันก็ตาม ตัวอย่างเช่นถ้าคุณมองไปที่ router.url ในบริการรักษาความปลอดภัย location.path () ตามที่ระบุไว้ในคำตอบจะให้ URL ไม่ว่าสถานะของเราเตอร์จะเป็นอย่างไร
Daniel van Niekerk

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

ฉันเห็น. ฉันก็ไม่พอใจเช่นกัน ฉันไม่ได้ลองด้วยตัวเอง แต่อาจMyTrackingServiceอธิบายได้ในstackoverflow.com/a/34548656/217408จะอนุญาตให้เข้าถึงค่าเหล่านี้
GünterZöchbauer

ชื่อเส้นทางหายไปแล้ว
GünterZöchbauer

4
@GunterZochbauer มีวิธีรับเส้นทางที่ร้องขอก่อนที่จะเปิดใช้งานหรือไม่ ตัวอย่างเช่นหากฉันต้องการจัดเก็บเส้นทางที่ขอไว้ในcanActivate()วิธีการหนึ่งเพื่อให้ฉันสามารถเปลี่ยนเส้นทางไปยังหน้า "เข้าสู่ระบบ" แล้วเปลี่ยนเส้นทางกลับไปยังเส้นทางเดิมหลังจากที่ผู้ใช้รับรองความถูกต้องแล้วหรือไม่
Yevgeny Ananin

1
คุณไม่สามารถทำได้ด้วยการป้องกัน
GünterZö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จะถูกนำมาใช้เป็นหลักสำหรับการนี้ไม่Router ฉันขาดความซับซ้อนของปัญหาหรือเปล่า
DonkeyBanana

ฉันหมายถึงActivatedRouteในเอกสารอย่างเป็นทางการ
DonkeyBanana

1
ไม่จำเป็นต้องมีอย่างน้อยที่นี่เราเตอร์ส่งออกประเภท "RouterEvent" ที่ขยายโดยเหตุการณ์เราเตอร์อื่น ๆ - angular.io/api/router/RouterEvent
chrismarx

1
@chrismarx คง
Vlad

@ DonkeyBanana ที่จริงแล้วถ้าคุณจัดการกับโมดูลที่ซ้อนกันซึ่งมีเส้นทางของตัวเองแล้วใช่ ในความเป็นจริงโดยใช้โมดูลที่ซ้อนกันและเราเตอร์ (ซึ่งเป็นสิ่งที่ทีมเชิงมุมแม้แนะนำ) นี้เป็นเพียงวิธีการรับ 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: 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

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 คำตอบช่วยฉันนี่เป็นคำตอบเดียวกับเขา แต่มีรายละเอียดเล็กน้อยเพราะมันอาจช่วยใครซักคน



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


นี่เป็นคำตอบที่ดี b / c หากคุณมีเส้นทางไวด์การ์ดที่เปลี่ยนเส้นทางกลับไปที่ / 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

ฉันได้รับเส้นทางปัจจุบันพร้อม params แบบสอบถาม วิธีแก้ปัญหาที่ฉันใช้คือสิ่งนี้แทน:

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แต่
Martin C.

4

วิธีที่ 1 : การใช้งานเชิงมุม: 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/ หรือติดตั้ง NG2 เตอร์ผู้ช่วยจาก NPM

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 ที่ระบุ) เพื่อแสดงส่วนประกอบย่อยตาม 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.