リンク vs コンパイル vs コントローラー 質問する

リンク vs コンパイル vs コントローラー 質問する

ディレクティブを作成すると、コンパイラ、リンク関数、またはコントローラーにコードを配置できます。

ドキュメントでは次のように説明されています:

  • コンパイルとリンク機能は、角度サイクルのさまざまなフェーズで使用されます。
  • コントローラはディレクティブ間で共有されます

しかし、私にとっては、どの種類のコードをどこに配置すればよいのかが明確ではありません。

例: コンパイル時に関数を作成し、それをリンクのスコープにアタッチできますか? それとも、コントローラーのスコープにのみ関数をアタッチできますか?

各ディレクティブが独自のコントローラーを持つことができる場合、ディレクティブ間でコントローラーはどのように共有されますか? コントローラーは本当に共有されるのでしょうか、それともスコープ プロパティだけでしょうか?

ベストアンサー1

コンパイル:

これは、Angular が実際にディレクティブをコンパイルするフェーズです。このコンパイル関数は、指定されたディレクティブへの参照ごとに 1 回だけ呼び出されます。たとえば、ng-repeat ディレクティブを使用するとします。ng-repeat は、添付されている要素を検索し、添付されている HTML フラグメントを抽出して、テンプレート関数を作成する必要があります。

HandleBars、アンダースコア テンプレート、または同等のものを使用したことがある場合は、テンプレートをコンパイルしてテンプレート関数を抽出するようなものです。このテンプレート関数にデータを渡すと、その関数の戻り値は適切な場所にデータがある HTML になります。

コンパイル フェーズは、Angular でテンプレート関数を返すステップです。Angular のこのテンプレート関数は、リンク関数と呼ばれます。

リンクフェーズ:

リンク フェーズでは、データ ( $scope ) をリンク関数にアタッチし、リンクされた HTML を返します。ディレクティブでは、この HTML がどこに移動するか、または何を変更するかを指定するため、すでに準備が整っています。これは、リンクされた HTML、つまり、すでにデータがアタッチされている HTML に変更を加える関数です。Angular では、リンク関数にコードを記述する場合、通常は post-link 関数です (既定)。これは、リンク関数がデータをテンプレートにリンクした後に呼び出されるコールバックのようなものです。

コントローラー:

コントローラーは、ディレクティブ固有のロジックを配置する場所です。このロジックはリンク関数にも配置できますが、その場合、スコープにロジックを配置して「共有可能」にする必要があります。その問題は、ディレクティブの要素によってスコープが破損することであり、これは実際には予期されないことです。では、2 つのディレクティブが相互に通信/連携する必要がある場合、代替手段は何でしょうか。もちろん、そのすべてのロジックをサービスに配置し、これらのディレクティブの両方がそのサービスに依存するようにすることはできますが、そうすると依存関係が 1 つ増えるだけです。代替手段は、このスコープにコントローラーを提供し (通常は分離スコープ)、そのディレクティブが他のディレクティブを「必要とする」ときに、このコントローラーを別のディレクティブに挿入することです。例については、angularjs.org の最初のページのタブとペインを参照してください。

おすすめ記事