I’ve been playing around with AngularJS directives a lot recently trying to modularize out some commonly used bits of code – particularly form validation stuff. As part of this I often want a controller in the directive (so I have child scopes reach in and add elements or trigger events), but I also want to be able to access some parent angular things such as the ‘form’ directive’s controller.
Typically if you have a controller in a directive it gets passed in as the 4th argument to the link function eg:
angularApp.directive('ngValidSubmit', function() {
return {
controller: function($scope, $element, $attrs) {
},
link: function(scope, elem, attr, ngValidSubmitCtrl) {
},
}
});
However if you have a require argument it also gets passed in as the 4th element in link which unfortunately trumps our controller:
angularApp.directive('ngValidSubmit', function() {
return {
require: 'form',
controller: function($scope, $element, $attrs) {
},
link: function(scope, elem, attr, formCtrl) {
},
}
});
I couldn’t find anything else referencing this problem on the internet, so as a hunch I tried (what turned out to be correct) multiple require arguments including requiring the directive itself:
angularApp.directive('ngValidSubmit', function() {
return {
require: [ 'form', 'ngValidSubmit' ],
controller: function($scope, $element, $attrs) {
},
link: function(scope, elem, attr, ctrls) {
var formCtrl = ctrls[0];
var ngValidSubmitCtrl = ctrls[1];
},
}
});
Hopefully this helps someone!