素晴らしい質問です!
したがって、これはコントローラーだけでなく、ディレクティブがそのジョブを実行する必要があるかもしれないが、必ずしもこのコントローラー/サービスを「外部世界」に公開したくないというサービスにも共通する懸念です。
私は、グローバル データは悪であり、避けるべきだと強く信じています。これはディレクティブ コントローラーにも当てはまります。この仮定を使用すると、これらのコントローラーを「ローカルに」定義するためにいくつかの異なるアプローチを取ることができます。その際、コントローラーは単体テストから「簡単に」アクセスできるようにする必要があるため、コントローラーをディレクティブのクロージャーに単純に隠すことはできません。IMO の可能性は次のとおりです。
1) まず、モジュール レベルでディレクティブのコントローラーを簡単に定義できます。例::
angular.module('ui.bootstrap.tabs', [])
.controller('TabsController', ['$scope', '$element', function($scope, $element) {
...
}])
.directive('tabs', function() {
return {
restrict: 'EA',
transclude: true,
scope: {},
controller: 'TabsController',
templateUrl: 'template/tabs/tabs.html',
replace: true
};
})
これは、 Vojta の作業に基づいたhttps://github.com/angular-ui/bootstrap/blob/master/src/tabs/tabs.jsで使用している単純な手法です。
これは非常に単純な手法ですが、コントローラーは依然としてアプリケーション全体に公開されているため、他のモジュールがそれをオーバーライドする可能性があることに注意してください。この意味で、コントローラーは AngularJS アプリケーションに対してローカルになります (したがって、グローバル ウィンドウ スコープを汚染しません) が、すべての AngularJS モジュールに対してグローバルでもあります。
2)テスト用にクロージャー スコープと特殊ファイルのセットアップを使用します。
コントローラー関数を完全に隠したい場合は、コードをクロージャーでラップできます。これは、AngularJS が使用している手法です。たとえば、NgModelControllerを見ると、独自のファイルで「グローバル」関数として定義されている (したがって、テストのために簡単にアクセスできる) ことがわかりますが、ビルド時にファイル全体がクロージャーでラップされていることがわかります。
要約すると、オプション (2) は「より安全」ですが、ビルドには事前に少し設定が必要です。