2016-12-21 37 views
0

我有以下路由我如何可以訪問在角2.0路由參數從沒有映射到一個路由/路由器出口組件

const routes: Routes = [ 
    { path: 'metadata/:path', component: MetadataDisplayComponent }, 
    { path: 'data/:path', component: DataDisplayComponent } 
] 

,這裏是我的AppComponent在元數據/數據顯示組件被注入。

@Component({ 
    selector: 'my-app', 
    template: ` 
     <tree-view></tree-view> <!-- a component the displays a tree like hierarchy of the path --> 
     <router-outlet></router-outlet> 
    ` 
}) 

所以基本上,我總是想樹視圖在那裏做它的事,無論元/數據狀態的,但我需要根據我在路由的參數進行初始化。

現在,我的問題是,我的「樹視圖」組件需要訪問我在2條路徑中定義的變量「:path」。當我嘗試以下(我的樹視圖中分量)

import { Component, OnInit } from '@angular/core'; 
import { ActivatedRoute, Params } from '@angular/router'; 

@Component({ 
    selector : 'tree-view', 
    // etc... 
}) 

export class TreeViewComponent implements OnInit { 

    private sub: any; 

    contstructor(
     @Inject(ActivatedRoute) private route: ActivatedRoute 
    ) {} 

    ngOnInit(): void { 
     this.sub = this.route.params.subscribe(params => { 
      console.log(params['path']); // this logs "undefined" 
     }); 
    } 

    // added this as per the suggestion in the comments 
    ngAfterViewInit(): void { 
     this.sub = this.route.params.subscribe(params => { 
      console.log(params['path']); // this logs "undefined" 
     }); 
    } 

    // etc... 

} 

我在訪問「路徑」參數是不成功的嘗試,它console.logged爲「不確定」。

當我嘗試在我的MetadataDisplayComponent中完全相同的ngOnInit時,我能夠console.log路徑沒有問題。

我幾乎肯定,這是因爲我的TreeViewComponent沒有與我的一個路由相關聯,因此無法訪問路由變量。它住在旁邊,但不在路由器插座內。

有什麼辦法可以讓這項工作出來?我承認,我可能已經以一種完全愚蠢的方式計劃了佈局,並願意接受建議。

+0

您的代碼並不顯示後。路線。你在做這個嗎? –

+0

是的,我。我試圖儘可能多地刪除代碼,以突出問題。我的路由在我的MetadataDisplayComponent中使用完全相同的設置,所以我至少得到了很多工作。 – Zack

+0

嘗試將訂閱移至ngAfterViewInit()。 –

回答

1

幾個小時尋找這是同樣的事情,什麼工作

服務/組件內部外路由器出口,如果你注入ActivatedRoute到變量此

this.router.events.subscribe(val => { 
     if (val instanceof NavigationEnd) { 

     let r = this.route; 
     while (r.firstChild) { 
      r = r.firstChild; 
     } 
     r.params.subscribe(params => { 
      //do stuff with params['yourParam'] 
      console.log(params); 
     }); 
     } 
    });