2016-12-13 11 views
3

内怠惰なモジュールのルートのparamsを取得できません:ItemsModuleは私が怠惰なモジュールをこのように使用するアプリケーション持っCanActivateガード

export const routes: Routes = [ 
    { 
    path: '', 
    component: WelcomeComponent 
    }, 
    { 
    path: 'items', 
    loadChildren: 'app/modules/items/items.module#ItemsModule' 
    } 
]; 

export const AppRoutingModule: ModuleWithProviders 
         = RouterModule.forRoot(routes); 

を、私は、のいずれかのガードを使用したいですサブルート:

const routes: Routes = [ 
    { 
    path: ':slug', component: ItemComponent, 
    canActivate: [ ItemFetchGuard ] 
    } 
]; 

export const coveragesRoutingModule: ModuleWithProviders = 
          RouterModule.forChild(routes); 

このガードは、データをフェッチするslugパラメータを取得する必要があります:

@Injectable() 
export class CoverageFetchGuard implements CanActivate { 
    constructor(
    private service: ItemService, 
    private route: ActivatedRouteSnapshot, 
    private ngRedux: NgRedux<IAppState>) {} 

    canActivate() { 
    const slug = this.route.params['slug']; 
    return this.service.getItem(slug) 
     .map(item => { 
     this.ngRedux.dispatch(itemSuccessfullyFetched(item)); 
     return true; 
     }) 
     .catch(error => { 
     this.ngRedux.dispatch(itemFetchFailed(error)); 
     return Observable.of(false); 
     }); 
    } 
} 

問題は、slugパラメータがルートのスナップショット内に見つかりません(そのchildrenプロパティでも)。このデータは後で入手できますが、入手する方法が見つからないようです...

これを実装するアプローチは何ですか?ご協力いただきありがとうございます!

答えて

4

私はついに「問題」(それは実際には1つではありません)を見つけました。私は正しい方法でガードを使用しませんでした。現在のルートについてのヒントは、依存性注入から取得しようとする代わりに、canActivateメソッドのパラメータを利用する必要があります。ここで

は、パラメータを取得する方法である:http://plnkr.co/edit/UVz5YUkK0JoAy0i64Lo3?p=preview

:ここ

@Injectable() 
export class ItemFetchGuard implements CanActivate { 
    canActivate(route: ActivatedRouteSnapshot, 
       state: RouterStateSnapshot) { 
    const slug = this.snapshot.params['slug']; 
    (...) 
    return true; 
    } 
} 

は、対応するplunkrです

関連する問題