2017-11-26 10 views
0

私は角2/4が新しいので、私の無知を許してください。私はさまざまなコンポーネントに注入したいサービスを持っていますが、このサービスはまずサーバーから取得する必要のあるメタデータを使用します。サービスがコンポーネントに注入される前に、サービスのデータが確実に解決されるようにする方法があるかどうかを知りたい。コンポーネントに注入する前にAngular 4サービスのデータを解決する方法はありますか?

ルートガードについては、私が探しているものに似て聞こえるが、サービス自体にはルートがないため、私の問題には当てはまらないと思う。

+0

...ありがとうサービスを使用してコンポーネントは、ルートを持っていますか? [ルートレゾルバ](https://angular.io/guide/router#resolve-pre-fetch-component-data)を使用するアイデアを調べることができます。現時点でルーティングを使用していない場合は、動作させるためにいくつかの変更が必要なように思えるかもしれません。 –

+1

角の初期化プロセスにフックし、APP_INITIALIZERトークンを使用してサービスの特定の機能(データを解決する機能でもよい)を実行してロードすることができます。あなたはそれを調べることができます。 –

+0

あなたのコードを投稿してください! – Mehdi

答えて

0

角度2/4で解決すると、ルートとコンポーネントをアクティブにする前にデータを取得できます。

UserResolveサービスは、サーバーからデータを取得します。

import { Injectable } from '@angular/core'; 
import { Resolve, ActivatedRouteSnapshot} from '@angular/router'; 
import { UserService } from '../services/user.service'; 

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

    constructor(private service: UserService) {} 

    resolve(route: ActivatedRouteSnapshot) { 
    return this.service.getUser().then(user => user); 
    } 

} 

注:モジュール内の「UserResolve」をインポートし、プロバイダ(下記参照)で使用します。

....... 
import { UserService } from '../services/user.service'; 
import { UserResolve } from './user.resolve'; 

@NgModule({ 
    imports: [ ... ], 
    declarations: [HomeComponent, AboutComponent, AboutUserComponent], 
    providers: [UserService, UserResolve] 
}) 
export class UserModule { } 

コンポーネントをロードする前にルータモジュールで使用して、サービスを呼び出して(データを解決する)

const aboutRoutes: Routes = [ 
     { 
     path: '', 
     component: HomeComponent, 
     children: [ 
      { 
      path: '', 
      component: AboutComponent, 
      resolve: { 
       user: UserResolve 
      } 
      }, 
      { 
      path: 'user', 
      component: AboutUserComponent 
      } 
     ] 
    } 
] 

+0

私の質問は、コンポーネントではなくサービスのデータを解決することでした。サービス自体は、ルートを持たないコンポーネントに注入される可能性があります。 – adam0101

関連する問題