ディレクティブ ロジックにコントローラー関数を使用しているところもあれば、リンクを使用しているところもあります。Angular ホームページのタブの例では、1 つのディレクティブにコントローラーを使用し、別のディレクティブにリンクを使用しています。この 2 つの違いは何でしょうか。
ベストアンサー1
質問を少し拡張して、コンパイル機能も含めるつもりです。
コンパイル関数-テンプレートDOM 操作 (つまり、tElement = テンプレート要素の操作) に使用します。したがって、操作はディレクティブに関連付けられたテンプレートのすべての DOM クローンに対して適用されます。(リンク関数 (または事前リンク関数と事後リンク関数) も必要で、コンパイル関数を定義した場合、属性が定義されていると属性が
'link'
無視されるため、コンパイル関数はリンク関数を返す必要があります'compile'
。)リンク関数- 通常、リスナー コールバック (
$watch
スコープ上の式など) の登録や DOM の更新 (iElement = 個々のインスタンス要素の操作など) に使用します。テンプレートが複製された後に実行されます。たとえば、 内では<li ng-repeat...>
、リンク関数は、<li>
その特定の要素のテンプレート (tElement) が (iElement に) 複製された後に実行されます<li>
。 を使用$watch
すると、ディレクティブにスコープ プロパティの変更を通知できます (スコープは各インスタンスに関連付けられています)。これにより、ディレクティブは更新されたインスタンス値を DOM にレンダリングできます。コントローラ関数- 別のディレクティブがこのディレクティブと対話する必要がある場合に使用する必要があります。たとえば、AngularJS のホームページでは、ペイン ディレクティブは tabs ディレクティブによって管理されているスコープに自身を追加する必要があるため、tabs ディレクティブは、ペイン ディレクティブがアクセス/呼び出すことができるコントローラ メソッド (API と考える) を定義する必要があります。tabsディレクティブとペイン ディレクティブの詳細な説明、および tabs ディレクティブが(ではなく)
を使用してコントローラに関数を作成する理由については、を参照してください。this
$scope
AngularJS コントローラの 'this' と $scope。
一般的に、メソッド$watches
、などをディレクティブのコントローラまたはリンク関数のいずれかに配置することができます。コントローラが最初に実行されますが、これが重要な場合があります(こちらを参照)。フィドルこれは、ctrl関数とlink関数が2つのネストされたディレクティブで実行されたときにログに記録します。ジョシュがコメントフレームワークの他の部分との一貫性を保つために、スコープ操作関数をコントローラー内に配置するとよいかもしれません。