2017-08-09 14 views
1

アプリケーションが起動する前にデータをロードしようとしています。私がそれを行う必要がある理由は、メニューのいくつかが、例えばユーザの場所に基づいて、いくつかのユーザ条件に基づいてアクセスを制限しているためです。角度4アプリケーションを初期化する前にデータをロード

ユーザーがまだ場所を持っていない場合、または場所に特定のビューにアクセスできない場合は、そのユーザーをブロックする必要があります。


が、私は成功せず、角度Resolveメソッドを使用しようとした、これは私がやったことです:

解決ガード

// The apiService is my own service to make http calls to the server. 
@Injectable() 
export class AppResolveGuard implements Resolve<any> { 
    constructor(
     private _api: ApiService, 
     private _store: Store<IStoreInterface>, 
    ) { } 

    resolve(): any { 
     return this._api.apiGet('loadData').subscribe(response => { 
      this._store.dispatch({ 
       type: USER_FETCH_DATA, 
       payload: response.usuario 
      }); 

      return response; 
     }); 
    } 
} 

ルーティング

export const routing = [ 
    { 
     path: '', component: AppComponent, canActivateChild: [AuthGuard], resolve: {app: AppResolveGuard}, 
     children: [ 
      { path: 'home', component: HomeComponent }, 
      { path: 'company', canActivate: [LocationGuard], component: CompanyComponent }, 
     ] 
    } 
]; 

AuthGuardは有効なCookieセッションをチェックするだけです。

ご覧のとおり、私がアクセスをブロックしようとしているルーティングは、companyルーティングです。 最初のアクセスがページhomeになってから、companyページにナビゲートすると、ユーザーデータと場所が既に使用可能であるため、検証がうまく動作するなど、別のページを最初に読み込んだときにアクセスできなくなる可能性があります。 LocationGuardユーザーの場所を検証しようとすると、そのデータはまだ使用できないため、最初のアクセスがページcompanyにある場合は、すべてのユーザーがそこをナビゲートすることがブロックされます。

また、ResolveCanActivateに置き換えようとしましたが、データが使用可能になった後も空白ページに表示されることはありません。

+0

これは、https:// stackoverflowを参照してください。com/a/45204693/415078 AppModuleをブートストラップする前に基本的にAPIを呼び出すことができます。そして、あなたの警備員にそのデータを渡す/アクセスすることができます – Kuncevic

+0

@Kuncevicは角度ルータを使って解決できませんか?それは店舗などにリンクされているからです。 – celsomtrindade

+0

あなたは店頭などに依存してアプリケーションを初期化する前にそれを行うことはできないように聞こえます – Kuncevic

答えて

6

いくつかのこと...

プリフェッチデータは、レゾルバの偉大な使用です。

ルートへのアクセスを防止することは、CanActivateを活用することです。

ただし、リゾルバはすべてのガードがチェックされた後にのみ動作します。したがって、あなたのコードは、のリゾルバを実行する前にCanActivate を実行しようとします。

enter image description here

+0

ハム.. canActivateを使っているので(ここで自分の答えをコメントしています)行く道? – celsomtrindade

+0

私は十分にあなたの要件を理解していない。ただし、解決策を親ルートに追加し、canActivateを子ルートに追加することもできます。そうすれば、子どものcanActivateの実行前に解決を実行する必要があります。 – DeborahK

0

私はthis questionの回避策を見つけました。

私はcanActivateを使用する方法を見つけました。私はすでに.map()を使用してObservableを返そうとしましたが、重要な点は最後に.first()です。これは問題を解決したものです。

Resolveを使用して同じ結果を達成する方法がある場合は、多分それが良いでしょう。ページがロードされる前に

関連する問題