2017-05-18 12 views
11

私は、Resolveを使用して、コンポーネントにナビゲートする前に、HTTP呼び出しを使用してリモートソースから一部のデータをあらかじめロードしている状況があります。今私は、いくつかの条件に応じて、データがプリロードされて、現在のユーザーに対してそのフィールドの一部を確認する必要があるガードロジックを実装する必要があります。CanActivate GuardからResolveリゾルバにAngular2が渡すデータはありますか?

私はCanActivateガードでバックエンドにまったく同じリクエストを行い、その後すぐにResolveでそのリクエストを避けたいと考えています。

CanActivateまたはルート設定内のルートデータにアクセスして、リゾルバを一時的にオーバーライドして、データオブジェクトの値を設定する方法がありますか?

私は

route.data['myData'] = value; 

のような単純なもので遠ざかってみました。しかし、これは、「オブジェクトが拡張可能ではありません」ので、エラーです。しかし、データがResolve.resolve()方法のroute.data要素に生き残っていなかったすべてのエラーを作成していない

this.router.routerState.root.data['myData'] = value; 

、:

は、私はまた、のようなものを試してみました。

私は、サービスにオブジェクトを一時的にキャッシュのように保存するようなカスタムやハックを避けたいと思います。先進的なプリフェッチやデータの所有権チェックなどをサポートするために、内部ルータ要素間でデータを転送するための標準的なメカニズムはありますか?あなたがResolveクラスのコンストラクタにルータ、およびアクセスも同じように注入した場合

EDIT routerStateは、作業を行います。しかし、これは後にクリアする必要があります。それ以外の場合は、ナビゲーション呼び出しの間に存続します。

答えて

0

財産ActivatedRouteSnapshotdataは不変である、これはエラーが表示された理由です:

object is not extensible

しかし、あなたはそのように、オブジェクト全体を置き換えることができます。

@Injectable() 
export class MyGuard implements CanActivate { 
    canActivate(
    next: ActivatedRouteSnapshot, 
    state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean { 

    // Use the spread operator to keep the previously resolved data 
    next.data = {...next.data, guardedData: 'guarded'}; 
    return true; 
    } 
} 

とアクセスをあなたのレゾルバでそれを

@Injectable() 
export class FooResolver implements Resolve<any> { 

    resolve(
    route: ActivatedRouteSnapshot, 
    state: RouterStateSnapshot 
): Observable<any>|Promise<any>|any { 
    return route.data.guardedData; 
    } 

} 
関連する問題