2017-10-23 3 views
1

私はAng4 Web Project 2で作業しています。ユーザーが管理セクションに入る前に、そのユーザーが承認されているかどうか確認したいと思います。 私はそのように、角度のルーティングにリゾルバを設定しようとした:resolver with angular4 in ASP.NET Web Api 2

resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot){ 
    return this.profile.getProfile() 
      .map(result => { setAuthorized(); return result;}) 
      .catch(res => { return Observable.of(new Profile()); }); 
} 
setAuthorized

()は関数のisAuthorized(で確認できるように機能がグローバル変数に権限を設定します) および認可ガード:

if (this.route.firstChild != null) { 
    return this.route.firstChild.data.map(res => { 
    if (isAuthorized()) { 
     return true; 
    } 
    }); 
} else { 
    return Observable.of(false); 
} 

ルーティングは次のとおりです。

const routes: Routes = 
    [ 
    {path: ':lang', component: LanguageComponent, 
     children: [ 
      { path: 'dashboard', component: DashboardComponent, resolve: { authority: AuthorityResolverService} }, 
      { path: 'admin', component: AdminComponent, canActivate: [AuthorizedGuard], resolve: { authority: AuthorityResolverService}}, 
     ]} 
    ]; 

すべてが正常に動作しているようです。しかし問題は、F5をクリックするか、URLをコピーして新しいウィンドウで開くときに、エラーページに常にリダイレクトされることです。私は、ワークフローを監視するとき、それは私が直接URLに到達しようとしていたときに、それはリゾルバを呼び出していないことを示しています

はlocalhost/adminに

私はすべてのエラーを受信して​​いないが、私は常にリダイレクトされます。 すべてのアイデア?

答えて

2

予想される動作です。あなたがルートをヒットすると、ガードが最初に実行され、canActivateがtrueを返すと、リゾルバが実行されます。 guardがfalseを返すので、あなたのリゾルバは呼び出されません(そうでなければなりません)。

これは、ガードが実際にどのようになっているかによって、プロファイル/許可を取得する方法で少しロジックを再設計することを意味します。あなたの条件は、ユーザーがガードに属するように認証されていることです。

解決者の目的は、ユーザーがコンポーネントをアクティブにできるようになると、コンポーネントに必要なデータを取得することです。

+0

大丈夫です。私はリゾルバを削除し、Gaurdの中にコードをコピーしてObservable of booleanを返しました。私はGuardの認証もしました。素晴らしいです、ありがとう! –