I have the situation where i need access to multiple directive controller methods.
I can access a method from a parent directive using the require like so:
require:"^parentDirective"
but I also need to access a method within a seperate directive (not a parent), the documentation says to use an array of strings like so:
require:["^parentDirective","directiveTwo"]
but doing this causes errors although the both directives have been compiled to the DOM.
Am I missing something here?
here is my directive:
angular.module('testModule', ['parentModule'], function () {
}).directive('testDirective', function() {
return {
restrict: 'AE',
templateUrl: 'testTemplate.tpl.html',
scope: {
value1: "=",
value2: "="
},
require:['^parentDirective','otherDirective'],
controller: function($scope,$modal,socketConnection) {
if(case_x == true){
$scope.requiredController_1.ctrl1Func();
}
else if(case_x == false){
$scope.requiredController_2.ctrl2Func();
}
},
link: function(scope,element,attrs,requiredController_1,requiredController_2){
scope.requiredController_1 = requiredController_1;
scope.requiredController_2 = requiredController_2;
}
};
});
... is quite illustrative as AngularJS doesn't allow multiple directives (on the same DOM level) to create their own isolate scopes. According to the documentation, this restriction is imposed in order to prevent collision or unsupported configuration of the $scope objects.
It is tempting to do too much work in the AngularJS controller. After all, the controller is where the view first has access to JavaScript via $scope functions. However, doing this will cause you to miss out on code sharing across the site and is not recommended by AngularJS documentation.
The ng-required Directive in AngularJS is used to specify the required attribute of an HTML element. The input field in the form is required only if the expression inside the ng-required directive returns true.
In my opinion, we use controller when we need to share or reuse $scope data or we want directive interactive with each other. link is used for DOM manipulation tasks. This article compare the difference of controller and link in AngularJS directive with example, you could refer to it.
I think this is close to what you want (hopefully):
http://plnkr.co/edit/WO6SROdVFOYlR22JQJPb?p=preview
Here were some thoughts:
I think the controller: function () {}
is executed on the way down, whereas the link: function () {}
is executed on the way back up (which happens after it walks down the DOM tree), meaning you needed to move your code that depends on other controllers from the directive controller to the directive link function.
Directives that utilize require
can only require directives on parent elements (using ^
) or the current element. You had in your html, originally, your elements all siblings. If that needs to be the case you need to wrap all the siblings in a fourth directive that they all "require
".
When you do require: []
an array is passed into the link function. Hence:
link: function(scope, element, attrs, controllers) {
var parent1 = controllers[0];
var other = controllers[1];
}
Does that answer everything?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With