コアポイント
前の記事では、@Input
および@Output
アノテーションを使用してコンポーネントに出入りする方法について説明しました。この記事では、Angular 2コンポーネントの別の基本的な側面を紹介します - プロバイダーを使用する能力。
コンポーネント構成プロパティリストに「プロバイダー」が表示されている可能性があります。また、コンポーネントに使用できる注射可能なオブジェクトのセットを定義できることがわかります。これは良いことですが、もちろん「プロバイダーとは何ですか?」という疑問を提起します。
回答この質問では、Angular 2の依存噴射(DI)システムの詳細な議論が必要です。将来のブログ投稿でDIを特にカバーすることができますが、Pascal Prechtの一連の記事では、ここからこれを非常によく紹介します:https://www.php.cn/link/f7f3bfce09a3008d185e177555549ec2d2 DIシステム(Pascalの記事で説明されているように)が、要するに、DIシステムは次の責任を負います。
図1:各コンポーネントには、プロバイダーを登録するための独自のインジェクターがあります。インジェクターは、サブインジェクターを作成し、プロバイダーにリクエストをローカルインジェクターから起動し、インジェクター階層を検索します。 上から
コンポーネントは下向きの方向グラフを形成しますが、関連するインジェクターには双方向の関係があります。親インジェクターは、プロバイダーに要求された場合、要求されたプロバイダーである場合、プロバイダーを要求する場合、子のインジェクター(下向き)を作成します。 Angular 2は、独自のインジェクターにあります。Angular2は親インジェクター(UP)を検索します。これは、下位レベルの同じ識別子を持つプロバイダーが、より高いレベルで同じ名前のプロバイダーをカバーすることを意味します。プロバイダーとは何ですか?
クラスプロバイダーは、クラスのインスタンスを生成/提供します。
MyClass
図2:4つの属性を持つシンプルなクラス。 (Visual Studio Codeのコードスクリーンショット)
わかりました、これはクラスです。次に、Angularにクラスプロバイダーを使用して登録するように指示して、依存関係噴射システムにコードで使用するインスタンスを提供するように依頼することができます。アプリケーションのルートコンポーネントとして使用されるコンポーネントProvDemo_01.ts
を作成します。このコンポーネントをbootstrap.ts
にロードし、アプリケーションを開始します。
図3:ルートコンポーネントをインスタンス化するアプリケーションのファイルを起動します。 bootstrap.ts
と呼ばれ、リポジトリにはコンポーネントのいくつかの異なるバージョンが含まれています。上記のProvDemo
からインポートされた行を更新することにより、表示されたバージョンを変更できます。ルートコンポーネントの最初のバージョンは次のようになります。
ProvDemo
'sをインポートし、それをMyClass
配列に追加し、コンストラクターパラメーターのタイプとして使用します。 CompDemo
providers
このコンポーネントに
MyClass
MyClass
@Component
に追加します
providers
コンストラクターにタイプ「MyClass
タイプを表示し、新しく登録されたMyClass
プロバイダーを探し、それを使用してインスタンスを生成し、「MyClass
」(初期小文字 "M")に割り当てられます。 MyClass
myClass
」に割り当てるインスタンスを生成するプロセスは、両方ともAngularによって行われます。 TypeScriptの構文を使用して検索するタイプを理解しますが、AngularのインジェクターはMyClass
インスタンスを見つけて返すことに責任があります。 myClass
上記を考慮して、Angularは「MyClass
がサーバーを呼び出してデータを取得した場合、テスト環境ではそうしないか、そうすることができない場合があります。この問題を解決するには、サーバーの呼び出しを行わないMyClass
でシミュレーションを置き換えることができる必要があります。 ProvDemo
MyClass
どのように交換を行うのですか?すべてのコードを繰り返して、各
に変更する必要がありますか?これは効率的ではなく、テストを書くのに悪いパターンです。 MyClass
MyClassMock
。 ProvDemo
デコレータに追加されたMyClass
属性は、次のように略されます。
MyClass
これは、「プロバイダーを見つけるためにトークン(キー)として@Component
を使用し、プロバイダーをproviders
に設定するため、プロバイダーを要求すると、依存噴射システムが
<code>providers: [ provide(MyClass, {useClass: MyClass} ]</code>
では、これはどのようにしてテストを実施するのに役立ちますか?これは、テスト環境ではプロバイダーの登録をオーバーライドし、効果的に次のことを行うことができることを意味します。
MyClass
MyClass
これにより、トークン(key)MyClass
をクラスプロバイダー
<code>providers: [ provide("aStringNameForMyClass", {useClass: MyClass} ]</code>
非クラスプロバイダーを注入
<code>provide(MyClass, {useClass: MyClassMock}) </code>
MyClass
TypeScriptを使用すると、MyClassMock
パラメーターがMyClass
タイプである必要があることを指定でき、DIシステムは作業を行い、MyClassMock
インスタンスを提供します。
しかし、クラスの代わりに文字列トークンを使用する場合、Angularにプロバイダーの結果を注入するように指示するにはどうすればよいですか? bootstrap.ts
ファイルを編集して、新しい値プロバイダーを追加し、文字列トークンに登録しましょう。バリュープロバイダーは、トークンに関連付けられた値を返すプロバイダータイプであることを忘れないでください。上記の例では、Angularにプロバイダーを@Component
の属性に追加して登録するように指示しますが、プロバイダーをブートストラップ関数に渡すことでプロバイダーを登録することもできます(同じコンテンツをproviders
に追加できます。属性):providers
図5:バリュープロバイダーのを追加しました。 bootstrap.ts
関数を呼び出して文字列トークン( "provide
")を渡すことでプロバイダーを追加し、バリュープロバイダーとプロバイダー自体を作成したいことを指定するオブジェクトを追加します。ケース、それは単純な値です。ここで、バリュープロバイダーによって生成された値をコンストラクターに注入したいと考えていますが、これは機能しません...SECURITY_KEY
<code>providers: [ provide(MyClass, {useClass: MyClass} ]</code>
パラメーターデコレータを提供します。他のすべてのデコレーターと同様に、私たちはそれをインポートする必要があり、それを使用してAngularに弦トークンに関連付けられたプロバイダーを注入するように指示します。これを行うには、SECURITY_KEY
:@Inject
を調整します
create ProvDemo_02.ts
Inject
プロバイダーを使用して同じ構文を挿入できます:
MyClass
わかりました、プロバイダーの登録と使用方法を学びましたが、プロバイダーが戻ってくるものを見てみましょう。
<code>providers: [ provide("aStringNameForMyClass", {useClass: MyClass} ]</code>
上記で見たように、プロバイダーは注入するものを生成する責任があります。クラスプロバイダーはインスタンスを生成し、それに注入します。ただし、クラスプロバイダーの結果を挿入するたびに新しいインスタンスを取得しないことを理解することが重要です。代わりに、DIシステムはインスタンスを1回生成し、キャッシュし、同じプロバイダーを使用するたびにその後の注入ごとに同じインスタンスを受信します。
コンポーネントを追加します。
図7:コンストラクターに注入MyClass
。 ChildComp
をインポートし、それを使用してコンストラクターパラメーターリストにタイプを設定することに注意してください。重要:MyClass
の唯一の目的は、インポートMyClass
であるChildComp
は、登録されたプロバイダーを見つけるためにDIシステムで使用されるトークンとして使用されることです。 ChildComp
はトークンに独自のプロバイダーを登録していないため、Angularはインジェクターの階層を検索してそれを見つけます。これが機能するためには、ChildComp
を追加する必要があります。
ProvDemo
'sがテンプレートに追加されました。 ChildComp
ProvDemo
ChildComp
@Component
コンポーネントを使用し、directives
要素をテンプレートに追加します。アプリケーションが実行されているとき、コンソールの出力はProvDemo
とChildComp
の両方が同じChildComp
インスタンスを受信することを示しています:ProvDemo
ChildComp
MyClass
今度は
<code>providers: [ provide(MyClass, {useClass: MyClass} ]</code>
ChildComp
MyClass
図9:独自のプロバイダーの
MyClass
私たちが変更する唯一のことは、ParentComp
属性を注釈に追加することです。もちろん、2つの異なる
@Component
Angularのこの機能は、プロバイダーが生成した結果と、単一のインスタンスまたは複数のインスタンスを使用するかどうかに多くの柔軟性を提供します。たとえば、コンポーネントをリピーターに入れてコンポーネントを複数回生成できます。この複製コンポーネントが独自のプロバイダーをレジスタすると、各コンポーネントは一意のプロバイダーを取得します。ただし、親コンポーネントのみにプロバイダーを登録する場合、各複製インスタンスが親コンポーネントのプロバイダーを共有します。 providers
Angular 2コンポーネント、プロバイダー、クラス、工場、および値に関するFAQ(FAQ)
Angular 2では、コンポーネントとプロバイダーが協力して、動的でインタラクティブなユーザーインターフェイスを作成します。コンポーネントは角度アプリケーションのビルディングブロックであり、プロバイダーはコンポーネントが使用できるサービスを作成するために使用されます。プロバイダーでは、コンポーネントがデータと機能を共有できるようにするため、アプリケーションの保守と更新が容易になります。
Angular 2でクラスをバインドする方法は?
Angular 2のコンテキストのAPIは何ですか?
Angular 2のコンテキストでは、API(アプリケーションプログラミングインターフェイス)は、ソフトウェアアプリケーションの構築と対話に使用される一連のルールとプロトコルです。 Angular 2は、開発者がコードと労力を少なくして複雑なアプリケーションを作成できるリッチAPIを提供します。 Angular 2 APIには、コンポーネント、サービス、命令、パイプラインなどを作成するための機能が含まれています。Angular 2で工場を使用するには、最初に定義する必要があります。これは、工場に生成したいオブジェクトを返す関数を作成することによって行われます。その後、この工場を
デコレータを使用して飾ることが含まれます。 @Component
デコレーターは、クラスがコンポーネントであることをAngularに伝え、成分の処理、インスタンス化、および実行時に使用する方法を決定するメタデータを提供します。 @Component
Angular 2でサービスを作成する方法は?
Angular 2でサービスを作成するには、サービスが提供する数字と関数をカプセル化するクラスを定義することが含まれます。このクラスは、クラスがアプリケーションの他の部分に注入できるサービスであることをAngularに伝える Angular 2で値を使用する方法は? @Injectable
Angular 2の値は、アプリケーションの他の部分に構成情報を提供するために使用されます。値を使用するには、最初にAngularモジュールに登録する必要があります。登録後、値をコントローラー、サービス、および工場に注入できます。
以上がAngular 2コンポーネントとプロバイダー:クラス、工場、および価値の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。