Как получить текущий маршрут

472

Текущие документы говорят только о получении параметров маршрута, а не фактических сегментов маршрута.

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

pdeva
источник
25
window.location.pathname
dchacke
1
@dchacke проблема в window.locationтом, что если в будущем они захотят реализовать рендеринг на стороне сервера, они столкнутся с некоторыми трудностями, поскольку windowих нет на сервере Node.js, но им нужно использовать стандартные методы Angular для доступа к маршруту. и они будут хорошо как на сервере, так и в браузере.
Мохаммад Кермани
Да, имеет смысл. Те, кто использует или планирует использовать рендеринг на стороне сервера, должны это учитывать.
Дчаке

Ответы:

524

Новый маршрутизатор V3 имеет свойство url.

this.router.url === '/login'
Victor96
источник
5
Я использую этот код, и я получаю этот URL в строковой переменной, но когда я пытаюсь напечатать в консоли .log, он не печатает this.fullUrl = this.router.url console.log (this.fullUrl); // не
печатаю
3
Обратите внимание на использование новой активной функции маршрутизатора <a routerLink="/dashboard" routerLinkActive="active"> Панель инструментов </a>
Victor96,
34
это бесполезно, когда вы перемещаетесь по хэш-стратегии, URL всегда "/"
Ninja Coding
5
@NinjaCoding Я использую хэш-стратегию и получаю только «/». Как я могу получить 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';
Gel
161

Угловой RC4:

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

Затем введите его:

constructor(private router: Router ) {

}

Затем назовите его параметром URL:

console.log(this.router.url); //  /routename
lowcrawler
источник
2
Дополнительная ясность о том, как импортировать сам маршрутизатор, очень полезна. Не могли бы вы уточнить, будет ли по-другому, если вы используете собственный маршрутизатор?
kbpontius
1
Это, безусловно, будет зависеть от «пользовательского» пользовательского маршрутизатора. (извините, это не был особенно полезный комментарий - если у вас есть конкретный вопрос, я бы предложил задать новый вопрос и сослаться на этот ответ)
lowcrawler
42
Я использовал это решение, но я всегда получаю это "/". Кто-нибудь знает почему?
Марсио М.
4
Внедрение Angular Dependency Injection основывается на синтаксисе сахара TypeScript, поэтому, когда вы объявляете private _router: Router в сигнатуре конструктора, свойство _router автоматически создается в текущем экземпляре класса с введенным Router. Это утверждение this.router = _router; это просто накладные расходы для меня, так как у вас есть две ссылки на один и тот же экземпляр объекта (в этом случае, маршрутизатор).
Андрей Reborn
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методу вместе с (добавленным) именем дочернего маршрута, к которому я хочу перейти.
Пдева
Понимаю. Я также не нахожу это удовлетворительным. Я сам не пробовал, но, возможно, MyTrackingServiceобъяснение в stackoverflow.com/a/34548656/217408 позволит получить доступ к этим значениям.
Гюнтер Цохбауэр
Имена маршрутов ушли в прошлое.
Гюнтер Цохбауэр
4
@GunterZochbauer есть ли способ получить запрошенный маршрут до его активации? Например, если я хочу сохранить запрошенный маршрут внутри canActivate()метода, чтобы я мог перенаправить на страницу входа в систему, а затем перенаправить обратно на исходный маршрут после аутентификации пользователя?
Евгений Ананин
1
Вы не можете сделать это с помощью canActivate guard?
Гюнтер Цохбауэр
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';

РЕДАКТИРОВАТЬ

Современный способ

import {filter} from 'rxjs/operators';

router.events.pipe(
    filter(event => event instanceof NavigationEnd)
)
    .subscribe(event => {
        console.log(event);
    });
Влад
источник
11
Действительно ли это рекомендуемый способ сделать что-то простое, например, проверить, куда указывает текущий URL? Я не спорю с тобой об этом. Однако я заметил, что маршрутизация является источником многих изменений, обновлений, путаницы и т. Д. Я ожидал, что ActivatedRoute будет использоваться в первую очередь для этого, а не для маршрутизатора . Возможно, мне не хватает сложности вопроса?
DonkeyBanana
Я имею в виду ActivatedRoute в официальных документах.
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/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
n4nd0_o
источник
27

Чтобы получить сегменты маршрута:

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

constructor( route: ActivatedRoute) {}

getRoutes() { const segments: UrlSegment[] = this.route.snapshot.url; }
ttugates
источник
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 который дает имя пути.

Хосе Г Варанам
источник
Обновление: activRoute.snapshot.url теперь является Observable, и вы должны подписаться на него.
Садок Мтир
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 === "/ search"

еще сделать следующее

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.

adrhc
источник
это хороший ответ, если у вас есть маршрутный маршрут, который перенаправляет обратно на / home event.url недостаточно для соответствия / home маршруту, он фактически покажет маршрут, который не существует. event.urlAfterRedirects напечатает фактический конечный маршрут. ти.
Ян Постон Фреймер
4

угловой 2 рк2

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 только тогда, когда пользователь находится на домашней странице. В этом случае мой URL-адрес маршрутизатора будет /home. Таким образом, я могу написать div следующим образом:

<div *ngIf="location == '/home'">
This is content for the home page.
</div>
Devner
источник
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

Халед Аль-Ансари
источник
Начиная с версии 2 был изменен, так как urlтеперь это уже не URL и строка, а a ComponentInstruction.
Мартин С.
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);
    }
}

ПУТЬ 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;
pixelbits
источник
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

это просто, в 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
            }); 
eberlast
источник
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);
    });
}

codescholar
источник
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