ディレクティブを作成すると、コンパイラ、リンク関数、またはコントローラーにコードを配置できます。
ドキュメントでは次のように説明されています:
- コンパイルとリンク機能は、角度サイクルのさまざまなフェーズで使用されます。
- コントローラはディレクティブ間で共有されます
しかし、私にとっては、どの種類のコードをどこに配置すればよいのかが明確ではありません。
例: コンパイル時に関数を作成し、それをリンクのスコープにアタッチできますか? それとも、コントローラーのスコープにのみ関数をアタッチできますか?
各ディレクティブが独自のコントローラーを持つことができる場合、ディレクティブ間でコントローラーはどのように共有されますか? コントローラーは本当に共有されるのでしょうか、それともスコープ プロパティだけでしょうか?
ベストアンサー1
コンパイル:
これは、Angular が実際にディレクティブをコンパイルするフェーズです。このコンパイル関数は、指定されたディレクティブへの参照ごとに 1 回だけ呼び出されます。たとえば、ng-repeat ディレクティブを使用するとします。ng-repeat は、添付されている要素を検索し、添付されている HTML フラグメントを抽出して、テンプレート関数を作成する必要があります。
HandleBars、アンダースコア テンプレート、または同等のものを使用したことがある場合は、テンプレートをコンパイルしてテンプレート関数を抽出するようなものです。このテンプレート関数にデータを渡すと、その関数の戻り値は適切な場所にデータがある HTML になります。
コンパイル フェーズは、Angular でテンプレート関数を返すステップです。Angular のこのテンプレート関数は、リンク関数と呼ばれます。
リンクフェーズ:
リンク フェーズでは、データ ( $scope ) をリンク関数にアタッチし、リンクされた HTML を返します。ディレクティブでは、この HTML がどこに移動するか、または何を変更するかを指定するため、すでに準備が整っています。これは、リンクされた HTML、つまり、すでにデータがアタッチされている HTML に変更を加える関数です。Angular では、リンク関数にコードを記述する場合、通常は post-link 関数です (既定)。これは、リンク関数がデータをテンプレートにリンクした後に呼び出されるコールバックのようなものです。
コントローラー:
コントローラーは、ディレクティブ固有のロジックを配置する場所です。このロジックはリンク関数にも配置できますが、その場合、スコープにロジックを配置して「共有可能」にする必要があります。その問題は、ディレクティブの要素によってスコープが破損することであり、これは実際には予期されないことです。では、2 つのディレクティブが相互に通信/連携する必要がある場合、代替手段は何でしょうか。もちろん、そのすべてのロジックをサービスに配置し、これらのディレクティブの両方がそのサービスに依存するようにすることはできますが、そうすると依存関係が 1 つ増えるだけです。代替手段は、このスコープにコントローラーを提供し (通常は分離スコープ)、そのディレクティブが他のディレクティブを「必要とする」ときに、このコントローラーを別のディレクティブに挿入することです。例については、angularjs.org の最初のページのタブとペインを参照してください。