2017-05-08 9 views
0

私はcanLoadを怠惰にロードされた状態に追加しました。問題は、router.navigate()を使用して状態が異なる状態から初期化されている場合、ルートパラメータを取得できないということです。私からそれを得るためにそこからそれらを取得しようとするActivatedRouteを注入しようとしている角度2:CanLoad実装からのルートパラメータを取得するにはどうすればよいですか?

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); 
    } 
    } 
} 

:だからここ

は私のルート設定である:

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

、これはProgramGuardの短いバージョンです。そこには何もない。

ユーザーがブラウザにURLを入力すると、ロケーションオブジェクトからパラメータを抽出できるので問題はありません。しかし、route.navigateを使用すると、ブラウザの位置は以前の状態に設定されます。

ご意見やご感想をお寄せください。

答えて

1

私は同様のことをやろうとしましたが、代わりにcanActivateガードに変更しました。また、canLoadガードは、実行したいかもしれないプリロードをブロックすることに注意してください。

ユーザーがルートにアクセスできない場合、理論的には、ロードすることさえできないことは理想的です。しかし、それは練習をすることができないと思われます。

何か試してみることができました(私はこれをやろうとしていたときに考えていませんでした)...パラメータを確認できるcanActivateガードを持つ親ルート(コンポーネントレス)を追加できました。次に、ユーザーが権限を持っている場合は、遅延ロードされたルートにルーティングします。

+0

ありがとう@DeborahK。私はあなたが明日書いた最後のオプションを試し、結果についてあなたにお返しします。理論的にはうまくいくはずです。今私がやっているのは、ブラウザのアドレスを更新するlocation.go()と、次にroute.navigate()を実行することです。それは動作しますが、状態のコンポーネントを2回インスタンス化します。 – jorgenv

+0

canActivateガードで親ルートを追加するというあなたのソリューションは@DeborahKを動作させました。私が必要とした唯一の変更はobserver.complete(boolean)の代わりにobserver.next(boolean)を処理することでした(これはcanLoadでは機能しないので変です)。 – jorgenv

+0

よろしくお願いします!それはうまくいった! – DeborahK

関連する問題