これは、直接的な解決策ではなく、この問題を解決するための組織的なアプローチです。私の質問自体は、互いに依存せず、それぞれの目的を果たすために独立して動作できる 2 つのディレクティブがある場合です。ただし、ディレクティブの 1 つが存在する場合は、もう一方の準備ができたら、もう 1 つのディレクティブを実行する必要があります。この場合、関数呼び出しやイベントをハードコードする必要なく、そのように機能することを確認する論理的な方法は何でしょうか?
たとえば、ある種のグリッドを構築する 1 つのディレクティブがあるとします。
angular.module('App').directive('appGrid',function() {
return function($scope, element) {
$scope.rows = ...
};
});
次に、要素を水平方向にスクロール可能にする別のディレクティブがあります。
angular.module('App').directive('appPane',function() {
return function($scope, element) {
element.attachHorizontalScroll();
};
});
したがって、私の HTML の例は次のようになります。
<div data-app-grid data-app-pane>
<div data-ng-repeat="row in rows">
<div data-ng-repeat="cell in row.cells">
{{ cell.data }}
</div>
</div>
</div>
基本的に、ディレクティブは、ディレクティブが実行され、テーブルの準備が整ったappPane
後に実行する必要があります。appGrid
私が考えることができる1つの解決策は、$scope.$watch
メソッドを使用して準備ができていることを確認するためにデータを監視することですが、これは問題を引き起こします.複数のディレクティブが、監視されている同じスコープ変数に書き込んでいる場合。
もう 1 つの解決策は、最初のディレクティブにイベント (elementReady など) を発行させ、次に 2 番目のディレクティブに引き継がせることです。しかし、最初のディレクティブが存在しない場合はどうなるでしょうか? では、2 番目のディレクティブは、その仕事をいつ行うべきかをどのように知るのでしょうか? 基本的に他のすべての要素に対してイベントを発生させる空のディレクティブである別のディレクティブが存在する可能性がありますが、これはちょっとしたハックです。また、他の複数のディレクティブがelementReady
イベントを発生させた場合はどうなりますか?
もう 1 つの解決策は、共有サービスを介して 2 つのディレクティブ間でロジックを共有する 3 番目のディレクティブを作成することです。しかし、これにより、3 番目のディレクティブが他のディレクティブとその間の共有サービスの両方に完全に依存するようになります。これには、ディレクティブを記述するための実際のコードだけでなく、より多くの不必要なテスト コードも必要です (1 + 1 行のコードしか必要としない 2 番目のソリューションと比較して、はるかに多くのコード)。
何か案は?