2017-04-21 124 views
2

我用Angular CLI創建了我的Angular應用,但現在我遇到了路由器問題。我想要構建的應用程序有一些頁眉和頁腳,但也有一些頁面沒有,例如登錄頁面。所以我需要一種方法來爲需要它的頁面分配頁眉和頁腳的佈局,併爲那些不需要的頁面使用其他佈局。什麼是正確的方法呢?角路由器 - 如何通過多個路由模塊共享父路由

我的第一個想法是有頁眉和頁腳這將是父到需要它的所有其他路線一條路線,但我不能找到一種方法,讓多個路由模塊相同的父。在文檔中能夠找到的父子關係的唯一方法是在定義路由時通過子列表,但是然後我需要將所有路由定義在我想避免的相同位置。

第二個想法是使用輔助路由,我嘗試將app.component.html定義爲內容的主要插座和用於頁眉和頁腳的兩個輔助插座,但之後我無法從功能路由模塊訪問輔助插座。

第三個想法是爲具有頁眉和頁腳的每個頁面使用相同組件的父路由。該共享組件將指定頁眉和頁腳,但這裏的問題在於,每次用戶導航到不同的功能時,頁眉和頁腳都會實例化,以便重置其狀態。

隨着我使用AngularJS UI的路由器,這是很容易與命名視圖,並指定共享父狀態的能力去做。我真的很感激在這裏指出正確的方向。

+0

代碼?它在哪裏? – Aravind

+1

是啊,我在這裏度過了同樣的問題http://stackoverflow.com/questions/43469401/manage-different-base-layouts-in-angular2,仍然沒有合適的aswer – Leguest

+1

你想@Aravind這部分看? – jbojcic

回答

0

會這樣的工作?

- 應用組件(與路由器出口)

----父組件(具有頁眉,頁腳和子路由器出口)

------要內所顯示的子組件父組件的路由器出口

----其他組件(如沒有頁眉或頁腳登錄)

+0

但是,如果我沒有錯,在這種情況下,所有的子組件都需要在父路徑模塊中定義,對吧? – jbojcic

+0

不,子組件不需要在父路由模塊中定義。 – DeborahK

+0

所以,如果我有兩個featureA和featureB都具有頁眉和頁腳,我有他們的路由模塊featureA-routing.module和featureB-routing.module。每個路由模塊都指定它自己的路由,如https://angular.io/docs/ts/latest/guide/router.html#!#routing-refactor。那麼,我如何設置他們共享同一個家長?你的意思是有這樣的東西: {path:'',component:ParentComponent,children:[...所有其他路由的功能A ...]}, 和 {path:'',component:ParentComponent,兒童:[...所有其他路線的功能B ...]}, 在每個模塊 – jbojcic

0

您可以訂閱你的頁腳組件內部的路由器,只是隱藏它基於的航線。

1)最簡單的黑客十歲上下的方式是簡單地將其隱藏

footer.component.ts

@HostBinding('style.display') 
display :string = 'block'; 

constructor(private router: Router) {} 

ngOnInit() { 
    this.router.events.subscribe((val) => { 

    if (val instanceof NavigationEnd) { 
    this.display = 'block'; 
    if (val.url == '/hidefooterroute') { 
     this.display = 'none'; 
    } 
    } 
... 

2)另一種方法可以做到這一點是要堅持的路線PARAMS .data並在主應用或服務內部訂閱。

someRoutes = [ 
    { path:'awesome', data:{ showFooter: false, title: 'This is page is too awesome for a footer'}, loadChildren: "./awesome.module#awesomeModule" } ]; 

... 

this.router.events 
    .filter(event => event instanceof NavigationEnd) 
    .map(() => this.activatedRoute) 
    .map(route => { 
    while (route.firstChild) route = route.firstChild; 
    return route; 
    }) 
    .filter(route => route.outlet === 'primary') 
    .subscribe((route) => { 
    // do things with route 
    route.data.subscribe((data) => { 
     // do things with route data 
     this.showFooter = data.showFooter; 
    }); 
    }); 
+0

所有這些都可以工作,但這是一個破解。這是非常常見的情況,應該可以使用路由器。 – jbojcic

+0

如果你想顯示/隱藏一小段內容,那麼'hack'就是一個相對術語* ngIf和就是這麼做的,所以你需要的只是提供布爾值的路由。工程中有一臺路由器 - https://ui-router.github.io/ng2/ - 但現在我覺得用'hack'更安全,imo。 – Dylan