require - 現在のディレクティブ リンク関数に別のコントローラーを渡す必要があります。require は、渡すディレクティブ コントローラーの名前を取ります。そのようなコントローラーが見つからない場合、エラーが発生します。名前には次のプレフィックスを付けることができます。
- ? - エラーを発生させないでください。これにより、require 依存関係がオプションになります。
- ^ - 親要素でもコントローラーを探します。
上記は公式ドキュメントの定義です。ここでのあいまいさは、正確には「ディレクティブ コントローラー」とは何かということです。
例として、angularjs-ui ブートストラップ プロジェクトのtabs ディレクティブを取り上げます。
angular.module('ui.bootstrap.tabs', [])
.controller('TabsController', ['$scope', '$element', function($scope, $element) {
... // omitted for simplicity
}])
.directive('tabs', function() {
return {
restrict: 'EA',
transclude: true,
scope: {},
controller: 'TabsController',
templateUrl: 'template/tabs/tabs.html',
replace: true
};
})
.directive('pane', ['$parse', function($parse) {
return {
require: '^tabs',
restrict: 'EA',
transclude: true,
scope:{
heading:'@'
},
link: function(scope, element, attrs, tabsCtrl) {
... // omitted for simplicity
},
templateUrl: 'template/tabs/pane.html',
replace: true
};
}]);
pane
ディレクティブには がありrequire: '^tabs'
、tabs
はその親要素のディレクティブの名前ですが、そのディレクティブにアタッチされているコントローラーの名前はですTabsController
。require: '^TabsController'
上記の定義の私自身の解釈からすると、そうではないはずであり、それはrequire: '^tabs'
明らかに間違っています。私の理解に欠けているものを教えてください。