require - Require another controller be passed into current directive
linking function. The require takes a name of the directive controller
to pass in. If no such controller can be found an error is raised. The name can be prefixed with:
- ? - Don't raise an error. This makes the require dependency optional.
- ^ - Look for the controller on parent elements as well.
Above is the definition from the official docs. The ambiguity here is what exactly is a "directive controller".
Take the tabs directive from the angularjs-ui bootstrap project, as an example.
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
};
}]);
The pane
directive has require: '^tabs'
, in which tabs
is the name of a directive on its parent element, while the name of the controller attached to that directive is TabsController
. From my own interpretation of the above definition, it should have been require: '^TabsController'
not require: '^tabs'
and that's obviously wrong. Please tell me what am I missing in my comprehension.
question from:
https://stackoverflow.com/questions/14915332/what-does-require-of-directive-definition-object-take 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…