До сих пор я видел много решений проблемы. Самым простым является, конечно, $emit
событие в $rootScope
как шина событий, например. (https://github.com/btilford/anti-patterns/blob/master/angular/Angular.md)
angular.module('myModule').directive('directiveA', function($rootScope) {
return {
link : function($scope, $element) {
$element.on('click', function(event) {
$rootScope.$emit('directiveA:clicked', event);
});
}
}
});
angular.module('myModule').directive('directiveB', function() {
return {
link : function($scope, $element) {
$rootScope.on('directiveA:clicked', function(event) {
console.log('received click event from directiveA');
});
}
}
});
а другой - объявить службу с помощью медиатора или функциональности pubsub/закрытой области действия, например. (Связь между несколькими контроллерами и директивой.)
module.factory('MessageService',
function() {
var MessageService = {};
var listeners = {};
var count = 0;
MessageService.registerListener = function(listener) {
listeners[count] = listener;
count++;
return (function(currentCount) {
return function() {
delete listeners[currentCount];
}
})(count);
}
MessageService.broadcastMessage = function(message) {
var keys = Object.keys(listeners);
for (var i = 0; i < keys.length; i++) {
listeners[keys[i]](message);
}
}
return MessageService;
}
);
Вопрос:
- Есть ли смысл использовать второй в приложении angular?
- и какие плюсы и минусы каждого из них сравниваются друг с другом?