Як дістати поточний маршрут


469

Поточні документи говорять лише про отримання парами маршруту, а не про фактичні сегменти маршруту.

Наприклад, якщо я хочу знайти батьківського поточного маршруту, як це можливо?


25
window.location.pathname
dchacke

1
@dchacke проблема в window.locationтому, що якщо в майбутньому вони захочуть реалізувати серверне візуалізацію, вони зіткнуться з деякими труднощами, оскільки windowйого немає на сервері Node.js, але їм потрібно використовувати стандартні методи Angular для доступу до маршруту і вони будуть добре як на сервері, так і в браузері.
Мохаммед Кермані

Так, має сенс. Ті, хто використовує або планує використовувати візуалізацію на стороні сервера, повинні враховувати це.
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
це марно, коли ви орієнтуєтеся на стратегію Hash, URL завжди "/"
Кодування Ninja

5
@NinjaCoding Я використовую стратегію Hash, і я отримую просто "/". Як я можу отримати URL-адресу маршруту за допомогою Hash?
Муртуза

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';
гель

159

Кутовий RC4:

Ви можете імпортувати Router з@angular/router

Потім введіть його:

constructor(private router: Router ) {

}

Потім зателефонуйте URL-параметру:

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

2
Додаткова зрозумілість щодо імпорту самого маршрутизатора дуже корисна. Чи можете ви уточнити, чи не було б інакше, якби ви користувались спеціальним маршрутизатором?
kbpontius

1
Це, безумовно, буде залежати від "користувальницької" якості користувацького маршрутизатора. (вибачте, що це не було особливо корисним коментарем - якщо у вас є конкретні запитання, я б запропонував зробити нове запитання та посилатися на цю відповідь)
lowcrawler

41
Я використовував це рішення, але завжди отримую це "/". Хтось знає, чому?
Marcio M.

4
Кутове введення залежностей покладається на синтаксис цукру TypeScript, тому коли ви оголошуєте приватний _router: Маршрутизатор у підписі конструктора, властивість _router автоматично створюється в поточному екземплярі класу із введеним маршрутизатором. Це твердження this.router = _router; для мене це лише накладні витрати, так як ви мали б дві посилання на один і той же екземпляр об'єкта (у цьому випадку маршрутизатор).
Ендрю Відроджений

1
@Marcio M. Це може бути тому, що маршрутизатор фактично не досяг цього стану, хоча 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

Розумію. Я також не вважаю це задовільним. Я сам не пробував цього, але, можливо, MyTrackingServiceпояснене в stackoverflow.com/a/34548656/217408 дозволить отримати доступ до цих значень.
Günter Zöchbauer

Назви маршрутів зараз уже немає.
Günter Zöchbauer

4
@GunterZochbauer є спосіб отримати потрібний маршрут до його активації? Наприклад, якщо я хочу зберегти потрібний маршрут всередині canActivate()методу, щоб я міг переадресувати на сторінку "входу", а потім переспрямувати назад до початкового маршруту після того, як користувач перевірить автентичність?
Євгеній Ананін

1
Ви не можете це зробити з охороною canActivate?
Günter 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 дав ще один спосіб дізнатися те саме через слухача подій маршрутизатора, який допоміг деяким людям знайти те, що шукають.
Раджат МС

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

EDIT

Сучасний спосіб

import {filter} from 'rxjs/operators';

router.events.pipe(
    filter(event => event instanceof NavigationEnd)
)
    .subscribe(event => {
        console.log(event);
    });

10
Це справді рекомендований спосіб зробити щось таке просте, як перевірити, куди вказує поточна URL-адреса? Я не сперечаюся проти вас на цьому. Проте я помітив, що річ маршрутизації - це джерело багатьох змін, оновлень, плутанин тощо. Я начебто очікував, що ActivateRoute буде використовуватися в першу чергу для цього, а не маршрутизатора . Можливо, мені не вистачає складності питання?
DonkeyBanana

Я маю на увазі ActivateRoute в офіційних документах.
DonkeyBanana

1
Принаймні тут не потрібно, маршрутизатор експортує тип "RouterEvent", який розширюється іншими подіями маршрутизатора - angular.io/api/router/RouterEvent
chrismarx

1
@chrismarx виправлено
Влад

@DonkeyBanana Насправді, якщо ви маєте справу з вкладеними модулями, які містять власні маршрути, то так. Насправді, використовуючи вкладені модулі та маршрутизатори (що навіть рекомендує команда Angular Team), це єдиний спосіб отримати фактичну 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/ActivateRoute-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 що дає назву шляху.


оновлення: enableRoute.snapshot.url - це спостерігається зараз, і ви повинні підписатися на нього.
Садок Мтір

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 === "/ пошук"

ще зробіть наступне

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

З кутовим 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 home, він фактично покаже маршрут, який не існує. event.urlAfterRedirects надрукує фактичний кінцевий маршрут. ти.
Ian Poston Framer


4

Ось що працює для мене в кутовій 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-адреса та рядок, а a ComponentInstruction.
Мартін К.

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-router-helper з 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

це може бути вашою відповіддю, використовуйте метод парами активованого маршруту, щоб отримати параметр з 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-адреси.

Більше того, я хочу спостерігати, який можна споживати в шаблоні, тому 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.