web stats

Get current directive controller in AngularJS

You can pass information and functionalut in to Directives in a number fo ways. One of those ways is the controller. Most directives will have a controller associated with it which acts as a way to organize the logic you need to call upon and is a good way to add functionality to the scope. Directives can also inherit a controller from higher up in the chain which is great, however it may make it harder to use the controller you define. For an exmaple:

var aControl = function() {};
var bControl = function() {};

var a = function() {
return {
link: function(scope, element, attrs, ctrl) {
// ctrl references aControl
},
controller: aControl
};
};

var b = function() {
return {
require: '^a',
link: function(scope, element, attrs, ctrl) {
// ctrl references aControl

// but how do I get a reference to bControl??
},
controller: bControl
};
};
So your control will be passed in unless you define require as can be seen in AngularJS code:
directive.require = directive.require || (directive.controller && directive.name);
So how do you get a handle to the current control? Well looking through the code we can see that when we have a directive on an element it will be attached:

$element.data('$' + directive.name + 'Controller', controllerInstance);
So to get at the current controller we just have to check the data on the current element like so:

var b = function() {
var myDirectiveName = 'b';

return {
require: '^a',
link: function(scope, element, attrs, ctrl) {
var myParentCtrl = ctrl;

var myCurrentControl = element.data('$' + myDirectiveName + 'Controller');
},
controller: bControl
};
};

Powered by WPeMatico