2017-05-08 58 views
0

我已經添加了一個canLoad守衛到延遲加載狀態。我遇到的問題是,如果使用router.navigate()從不同的狀態初始化狀態,那麼我無法獲取任何路由參數。Angular 2:我如何從CanLoad實現獲取路由參數?

因此,這裏是我的路由配置:

path: 'programs/:programId/dashboard', 
loadChildren: './program.module#ProgramModule', 
canLoad: [ProgramGuard] 

,這是ProgramGuard的短版:

export class ProgramGuard implements CanLoad { 

    canLoad(route: Route): Observable<boolean> { 

    //route object doesn't have any reference to the route params 

    let programId = paramFromRoute; 

    return Observable.create(observer => { 

     if (programId == authorizedProgramId) 
     observer.complete(true); 
     else 
     observer.complete(false); 
    } 
    } 
} 

我試圖注入ActivatedRoute,試圖從那裏得到他們怎麼得來的那裏,但沒有。

如果用戶在瀏覽器中鍵入URL,那麼沒有問題,因爲我可以從位置對象中提取參數。但是當使用route.navigate時,瀏覽器的位置仍然被設置爲之前的狀態。

任何幫助或想法將不勝感激。

回答

1

我試圖做類似的事情,最終改爲使用canActivate守衛。還要注意,canLoad保護可以阻止您可能想要執行的任何預加載。

理論上,如果用戶無法訪問路由,那麼甚至沒有加載路由會很好。但它的做法似乎太有限,無法做出決定。你可以嘗試一些東西(當我嘗試這樣做時,我沒有想到它)...你可以添加一個父路由(無組件),它有一個可以檢查參數的canActivate守護進程。然後,如果用戶有授權,則路由到延遲加載的路由。

+0

謝謝@DeborahK。我會嘗試明天寫下的最後一個選項,並且告訴你結果。它應該在理論上起作用。現在我正在做的是任何時候我想要路由到該狀態是首先做一個location.go(),它更新瀏覽器的地址,然後route.navigate()。它可以工作,但它實例化狀態的組件兩次。 – jorgenv

+0

您的解決方案使用@AbActiveActivate守護進程添加了一條父路由@DeborahK。我需要做的唯一的改變是處理一個observer.next(boolean),而不是observer.complete(boolean)(這很奇怪,因爲這在canLoad中不起作用)。 – jorgenv

+0

好聽!很高興工作! – DeborahK