2016-07-30 2 views
3

Я пытаюсь проверить активный дочерний маршрут в родительском компоненте, но у меня возникают трудности с ним.Angular2 (rc4) - Проверить активный дочерний маршрут в родительском компоненте

Я попытался подписаться на ActivatedRoute делать что-то вроде этого:

class ParentComponent { 
    constructor(private _route:ActivatedRoute) {} 

    ngOnInit() { 
     this._route.data.subscribe(value => console.log(value)}); 
    } 
} 

Я прочитал много потоков на переполнение стека, но не может найти решение, которое проверяет и получает обновленный относительно дочерние маршруты родительского компонента.

Любые идеи?

ответ

2

Вы можете получить доступ к активному маршруту ребенка с помощью ниже фрагмента кода

constructor(private router:Router, private currentActivatedRoute:ActivatedRoute) 
// this should be called in ngOnInit 
    var state = this.router.routerState 
    var children = state.children(this.currentActivatedRoute) 

RouterState, Tree

+0

Огромное спасибо :) –

+0

'Свойство 'children' не существует в типе 'RouterState'':/ – Inigo

+3

Не уверен, что что-то изменилось после того, как этот ответ был отправлен, но дети являются собственностью ActivatedRoute, NOT Router – Inigo

2

Во время написания этих строк, выбранный ответ, кажется, не работает больше.

Если вы хотите получать уведомления о появлении изменения маршрута, вы можете подписаться на наблюдаемый Router.events. например, NavigationEnd события сохранить URL как свойство:

this.router.events.filter(evt => evt instanceof NavigationEnd) 
        .map(evt =>evt.url) 
        .subscribe(url=>console.log(url)); 

Если вы хотите сравнить текущий маршрут к ребенку путь -Давайте сказать "child" -. Вы можете использовать Router.isActive() метод:

let events = this.router.events; 
events.filter(evt => evt instanceof NavigationEnd) 
     .map(() =>{ 
      let exact=true; 
      let childRoute=this.router.createUrlTree(["child"], {relativeTo: this.route} 
      return this.router.isActive(childRoute,exact); 
     }) 
     .subscribe(active=>console.log(`child route is active :${active`)); 

Примечания:

  • this.router является Router экземпляр
  • this.route является экземпляром ActivatedRoute
  • exact используется для точного соответствия: если маршрут был "child/grand-child"this.router.isActive(route,true) вернул бы false
+0

Получение этой ошибки .. 'свойство 'url' не существует в типе 'Event' Свойство 'url' не существует в типе 'RouteConfigLoadStart'' –

+0

@Aakriti Вам нужно фильтровать события маршрутизатора и принимать только события NavigationEnd. 'this.router.events.filter (evt => evt instanceof NavigationEnd)' (может быть, вам нужно объявить тип 'Observable ' следующим образом: 'this.router.events.filter (evt => evt instanceof NavigationEnd) как Observable ' – n00dl3

+0

Как мы будем использовать карту с этим .. она говорит:« Не могу найти карту имени » –

Смежные вопросы