В текущих документах обсуждается только получение параметров маршрута, а не фактических сегментов маршрута.
Например, если я хочу найти родителя текущего маршрута, как это возможно?
В текущих документах обсуждается только получение параметров маршрута, а не фактических сегментов маршрута.
Например, если я хочу найти родителя текущего маршрута, как это возможно?
Новый маршрутизатор V3 имеет свойство url.
this.router.url === '/login'
Угловой RC4:
Вы можете импортировать Router
из @angular/router
Затем введите его:
constructor(private router: Router ) {
}
Затем назовите его параметром URL:
console.log(this.router.url); // /routename
Ввести 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(...);
}
для нового маршрутизаторa >= 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"
}
Для тех, кто еще ищет это. На 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
}
Рекомендации:
Чтобы получить сегменты маршрута:
import { ActivatedRoute, UrlSegment } from '@angular/router';
constructor( route: ActivatedRoute) {}
getRoutes() { const segments: UrlSegment[] = this.route.snapshot.url; }
Использовать этот
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);
});
Вы можете попробовать с помощью
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
, который дает имя пути.
Чтобы надежно получить полный текущий маршрут, вы можете использовать это
this.router.events.subscribe(
(event: any) => {
if (event instanceof NavigationEnd) {
console.log('this.router.url', this.router.url);
}
}
);
Родной объект 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);
ПРИМЕЧАНИЕ. НЕ ИСПОЛЬЗУЙТЕ ЭТО В СЕРВЕРЕ
короткая версия, если у вас есть импортированный маршрутизатор, то вы можете просто использовать что-то вроде
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 помог мне, это тот же ответ, что и у него, но с небольшой детализацией, так как это может помочь кому-то
В Angular2 Rc1 вы можете ввести RouteSegment и передать их в методе naviagte.
constructor(private router:Router,private segment:RouteSegment) {}
ngOnInit() {
this.router.navigate(["explore"],this.segment)
}
С 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.
angular 2 rc2
router.urlTree.contains(router.createUrlTree(['/home']))
Вы можете использовать ActivatedRoute
, чтобы получить текущий маршрутизатор
Оригинальный ответ (для версии RC)
Я нашел решение на AngularJS Google Group, и это так просто!
ngOnInit() {
this.router.subscribe((url) => console.log(url));
}
Здесь оригинальный ответ
https://groups.google.com/d/msg/angular/wn1h0JPrF48/zl1sHJxbCQAJ
Вот что работает для меня в 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>
У меня была такая же проблема, используя
this.router.url
Я получаю текущий маршрут с параметрами запроса. Обходной путь я использовал вместо этого:
this.router.url.split('?')[0]
Не очень хорошее решение, но полезно.
Правильный ответ сегодня:
1) Import ActivatedRoute:
import {ActivatedRoute} from '@angular/router';
2) Создайте свойство в своем классе для хранения URL-адреса:
private myUrl:any;
3) Создайте экземпляр в конструкторе из ActivatedRoute и получите все, что хотите:
constructor (...private route:ActivatedRoute, ...) {
this.route.url.subscribe(
(data: any) => {
for (let i of data) {
this.myUrl = i.path;
// ... get whatever you want
}
console.log("My Current Url ", this.myUrl);
console.log("There is something more: ",data);
},
(error: any) => console.debug("URL ERROR", error));
}
Для ваших целей вы можете использовать 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
Чтобы найти родителя текущего маршрута, вы можете получить UrlTree
от маршрутизатора, используя относительные маршруты:
var tree:UrlTree = router.createUrlTree(['../'], {relativeTo: route});
Затем, чтобы получить сегменты первичного выхода:
tree.root.children[PRIMARY_OUTLET].segments;
На данный момент я получаю свой путь следующим образом -
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
ПУТЬ 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;
это просто, в 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
});
router.events.subscribe(e => {
if (e instanceof NavigationEnd) {
this.currentUrl = e.url;
}
});
это может быть ваш ответ, используйте метод 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'];
});
}
}
this.router.events.subscribe((val) => {
const currentPage = this.router.url; // Current page route
const currentLocation = (this.platformLocation as any).location.href; // Current page url
});
Если вам нужен доступ к текущему URL, обычно вам нужно подождать, пока NavigationEnd или NavigationStart что-то предпримут. Если вы просто подписываетесь на события маршрутизатора, подписка выдаст много событий в жизненном цикле маршрута. Вместо этого используйте оператор RxJS, чтобы фильтровать только необходимое событие. Благоприятный побочный эффект этого теперь у нас есть более строгие типы!
constructor(private router: Router) {
router.events.pipe(
filter(ev => (ev instanceof NavigationEnd))
).subscribe((ev: NavigationEnd) => {
console.log(ev.url);
});
}
Я столкнулся с проблемой, когда мне понадобился путь 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)
);
Надеюсь, это поможет, удачи!
Вы можете использовать в файле .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
}
});
в файле компонента:
import {ActivatedRouteSnapshot} from '@angular/router';
constructor(state: ActivatedRouteSnapshot) {
console.log(state.path)
}
в файле маршрутизации: