ネストできるアコーディオン ディレクティブを Angular で作成したので、アコーディオンはその中に子アコーディオンを持つことができます。
アコーディオンが開閉するときにイベントをブロードキャストして、他のディレクティブがそれをリッスンできるようにしたい (たとえば、アコーディオン パネル内のメニューは、その中のアコーディオンが開いているときに表示される可能性がある)。
問題は、外側のアコーディオンの内側にネストされた内側のアコーディオンがある場合、内側のアコーディオンが開閉イベントをブロードキャストしていないため、イベントを内側のアコーディオンの子要素にブロードキャストしたくないということです。
それが意味をなさない場合に備えて、別の言い方をすれば、ネストされたアコーディオン内の要素は、DOM ツリーの上位にあるアコーディオンではなく、そのアコーディオンによってブロードキャストされるオープン/クローズ イベントをリッスンできる必要があります。
うまくいけば、これに対する簡単な解決策があります。
更新:ここにデモを追加: http://jsfiddle.net/jonhobbs/xr1kLqba/
デモ イベントが現在まったく機能していないため、明らかに $broadcast と $on を正しく理解していませんが、私が何をしようとしているのかは明らかなはずです!
編集:どうやら 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' });
});
}
};
});