Я создал аккордеонную директиву в Angular, которая может быть вложенной, поэтому аккордеон может иметь в себе дочерние аккордеоны.Пользовательская угловая директива вещания события, но не для вложенных детей?
Я хочу широковещать событие, когда аккордеон открывается и закрывается, так что другие директивы могут его прослушивать (например, меню внутри панели гармоник может обнаруживать себя, когда аккордеон внутри него открыт).
Дело в том, что если внутри внешнего встроен внутренний гармоник, я не хочу, чтобы событие транслировалось на дочерние элементы внутреннего гармоника, потому что внутренний гармоник не транслировал событие open/close.
На всякий случай это не имеет смысла, иначе говоря, элемент внутри вложенного аккордеона должен уметь прослушивать широковещательную передачу открытого/закрытого аккордеона, в которой он находится, а не дальше по дереву DOM ,
Надеюсь, это простое решение.
Update: добавил демо здесь: http://jsfiddle.net/jonhobbs/xr1kLqba/
я ясно не поняли $ вещания и $ на должным образом в качестве демо событий в настоящее время не работает вообще, но это должно быть ясно, что я пытаясь сделать!
Редактировать: По-видимому, все ссылки на jsfiddle должны сопровождаться кодом, поэтому вот некоторые из них.
var app = angular.module('app', []);
app.controller('MainCtrl', function($scope) {
$scope.mainMenuOpen = true;
})
.directive('myPanel', function() {
return {
restrict: 'EA',
scope: {
isOpen: '=?'
},
link: function($scope, $element, $attrs) {
$element.find('> BUTTON').bind('click', function() {
$scope.isOpen = !$scope.isOpen;
if ($scope.isOpen) {
$scope.$broadcast('panelOpened');
}
});
}
};
})
.directive('reactToPanelOpenClose', function() {
return {
restrict: 'EA',
scope: {},
link: function($scope, $element, $attrs) {
$scope.$on('panelOpened', function() {
alert("clicked");
$element.css({ 'background-color': 'red' });
});
}
};
});
здесь немного кода, например, названия ваших событий, масштаб которых вы передаете/слушаете, и т. Д .... – Claies
Извините, здесь, вероятно, слишком много кода для публикации здесь и его сокращения, чтобы сделать jsfiddle вызовом. Я могу назвать события чем угодно, поскольку они в настоящее время не существуют, и предположим, что я буду транслировать их из созданной мной гармонической директивы. Честно говоря, это не обязательно должно быть о моей директиве-аккордеоне. Это скорее общий вопрос о том, как горячий транслировать событие по цепочке, но останавливайтесь, когда вы попадаете в директиву того же типа. – jonhobbs
, честно говоря, поскольку «$ broadcast» не может быть отменена получателями, сценарий, который вы только что описали, нелегко смоделирован. Самый простой способ сделать это, вероятно, состоит в том, чтобы программно сгенерировать строковый ключ, который используется для вашего имени события, и каким-то образом передать это значение элементам, которые необходимо прослушать, чтобы каждый аккордеон был уникальным. – Claies