Reputation: 5286
Consider two nested directives with isolate scopes:
<dctv1>
<dctv2></dctv2>
<dctv1>
If I want dctv2
to talk to dctv1
I have may options:
dctv1
in the definition of dctv2
using the require:'^dctv1'
<dctv2 callParent="hello()"></dctv2>
and scope:{callParent:'&'}
$scope.$emit
in dctv2
but then all parent scopes will hear the message.Now I want dctv1
to talk to dctv2
.
$scope.$broadcast
, but then all children will hear.By talk to here i mean call a function or similar. Don't want to set up watches clogging the digestloop.
How can I make dctv1
notify dctv2
in the best way, making them loose-coupled? I should just be able to remove dctv2 without errors.
Upvotes: 9
Views: 1974
Reputation: 54771
Take a look at AngularJS NgModelController for some ideas.
Each <dctv2>
directive would require <dvtv1>
to have it's controller injected. You can then add objects or callbacks to properties of that controller, and remove them when <dctv2>
is destroyed.
<dvtv1>
would not talk directly to children, but would trigger callbacks bound to it's properties.
For example;
NgModelController
has $parsers
and $formatters
that are an array of function callbacks. You push your own functions into the array to extend that controllers behavior.
When NgModelController
performs input validation it's basically talking to other directives via these properties.
Upvotes: 3
Reputation: 181
One way is to make a Service/Factory that will communicate with the controllers that you want.
For example, here's a getter/setter Factory
.factory('factoryName', function () {
var something = "Hello";
return {
get: function () {
return something;
},
set: function (keyword) {
something = keyword;
return something ;
}
};
}])
And then in your controllers:
.controller('controllerOne', ['factoryName', function (factoryName) {
$scope.test = factoryName.get();
}]);
.controller('controllerTwo', ['factoryName', function (factoryName) {
$scope.test = factoryName.get();
$scope.clickThis = function (keyword) {
factoryName.set(keyword);
};
}]);
I suggest reading up on this : Can one controller call another?
Upvotes: 0
Reputation: 971
I would suggest using angular services. That way you can decouple your behavior into one or more services.
Take a look at this also : AngularJS : How to watch service variables?
Upvotes: 0
Reputation: 132
You can manage it using an id for each child that have to be passed to the parent; the parent will broadcast back the event using that id: the child will do the action only if the id passed from the parent is the his own.
Bye
Upvotes: -1