web-dev-qa-db-ja.com

Angular 6シングルトンサービスの作成

Angular 6にシングルトンサービスの作成方法にいくつかの変更があったことを理解しています。アクセスするコンポーネントごとに1回構築する必要がある認証サービスがあります。サービスのルートへのプロバイダー:

@Injectable({
  providedIn: 'root'
})

そして、app.module.tsファイルで、AuthServiceをNgModuleのプロバイダーの1つとして設定します。ただし、Authサービスを使用するさまざまなコンポーネント間をルーティングするたびに、Authサービスの新しいインスタンスが作成されます(最初に呼び出されたときからデータをクリアします)。認証サービスが一度だけインスタンス化されることを確認してから、異なるコンポーネント間でそのインスタンスにアクセスするにはどうすればよいですか?

7
Dan

これは、provideInをサービスレベルに追加するデフォルトの動作です。 Docs に従って

ここで提供されているAngularは、ルートインジェクターがHeroServiceのインスタンスの作成を担当していることを示します。この方法で提供されるサービスは、アプリケーション全体で自動的に利用可能になり、任意のモジュール。

あなたの場合、providedIn: 'root'およびmodule.tsにはアンダーサプライのみがあります。次を参照してくださいanswer

6
Sajeetharan

他の混乱を避けるために、ドキュメントに記載されているように、2つの方法でシングルトンを作成できます( singleton-services ):

  • サービスをアプリケーションルートで提供することを宣言します。
    @Injectable({providedIn: 'root'})
    この場合、サービスはどのモジュールにもインポートしないでください。
  • AppModuleまたはAppModuleによってのみインポートされるモジュールにサービスを含めます。
    ここでは、{providedIn:'root'}を使用する必要はありません。

私の場合、JIT(通常のngビルド/ ngサーブ)を使用すると、シングルトンサービスが機能しませんでした。私にとっては、AoT(ng build --aot/ng serve --aot)を使用した場合にのみ機能しました。

2
knnhcn