web-dev-qa-db-ja.com

角度6依存性注入

最新リリースのAngular 6では、サービスはサービスメタデータのprovidedInプロパティを使用してモジュールに登録されています。

@Injectable({
  providedIn: 'root',
})
export class HeroService {}

ただし、ドキュメントでは、Angular 5で行ったのと同じように、モジュールメタデータ内のモジュールproviders配列にサービスを登録することも参照しています。

@NgModule({
  providers: [HeroService],
})
export class AppModule {}

そう、

  • インジェクタにインジェクションするサービスを知らせるにはどの方法を使用する必要がありますか。
  • モジュールのproviders配列メソッドは廃止予定ですか?
54
Hamed Baatour

基本的にはどちらでも使用できますが、新しいCLIではprovideInの作成中にserviceが自動的に追加されます。

providedIn

新しいprovidedIn属性を使用して、@Injectable()デコレータのすぐ内側にプロバイダを登録するための新しい推奨方法があります。値またはアプリケーションの任意のモジュールとして'root'を受け入れます。 'root'を使用するとき、あなたの注射可能物はアプリケーションのシングルトンとして登録されるでしょう、そしてあなたはそれをルートモジュールのプロバイダーに追加する必要はありません。同様に、providedIn: UsersModuleを使用すると、注入可能オブジェクトは、モジュールのプロバイダーに追加せずにUsersModuleのプロバイダーとして登録されます。

この新しい方法は、アプリケーションのツリーシェイクを改善するために導入されました。現在、モジュールのプロバイダに追加されたサービスは、たとえそれがアプリケーションで使用されていなくても、最終的なバンドルになるでしょう。これは少し悲しいことです。

詳しくはこちらをご覧ください

66
Pardeep Jain

いつものように複数の解決策が利用可能であるときそれはあなたが達成したいことによります。しかし ドキュメンテーション はあなたが選ぶべきいくつかの指示を与えます。

アプリケーションルートインジェクタで常にサービスを提供するのが望ましくない場合があります。おそらく、ユーザーはサービスの使用を明示的にオプトインするか、またはサービスを遅延負荷のコンテキストで提供する必要があります。この場合、プロバイダは特定の@NgModule classに関連付けられている必要があり、そのモジュールを含むインジェクタによって使用されます。

そのため、基本的に、アプリケーション全体のサービスにはprovidedIn: 'root'を使用します。他のサービスについては古いバージョンを使い続けてください。

あなたにはすでに違った方法でサービスを提供するという選択肢があることを忘れないでください。例えば、Injectableをコンポーネントレベルで宣言することも可能です(これはV6では変わりません)。

  @Component({
    selector: 'app-my-component',
    templateUrl: './my.component.html',
    providers: [ MyService ]
  })

このようにして、サービスはMyComponentとそのサブコンポーネントツリーでのみ利用可能になります。

10
JEY

Angular 5+開発者を使用している場合は、providedIn: 'root'として宣言されると自動的に注入可能サービスが作成されます。この場合、app.module.tsにサービスをインポートする必要はありません。他のコンポーネントで直接使うことができます。

1
Prashant

@NgModule()および@Component()デコレータには、providerメタデータオプションがあります。ここで、NgModuleレベルまたはコンポーネントレベルのインジェクタ用にプロバイダを設定できます。

@Injectable()デコレータにはprovidedInメタデータオプションがあります。このオプションでは、ルートインジェクタまたは特定のNgModuleのインジェクタを使用して、装飾サービスクラスのプロバイダを指定できます。

あなたの場合、それは "root"レベルで提供されているので、これをモジュールのプロバイダとして再度追加する必要はありません。

依存性注入についての詳細 はこちら

0
CharithJ