そこで、AngularJS でトグル (ドロップダウン) メニューのディレクティブを作成しました。ページ内の複数のアイテムにディレクティブを使用しましたが、小さな問題があります。あるアイテムが開いているときに別のアイテムをクリックすると、前のアイテムが閉じます。event.preventDefault と event.stopPropagation は、前のアイテムのイベントを停止し、閉じません。これを修正する方法についてのアイデアはありますか? おそらくスコープ内のイベントのみを停止する方法はありますか?
app.directive('toggleMenu', function ($document) {
return {
restrict: 'CA',
link: function (scope, element, attrs) {
var opened = false;
var button = (attrs.menuButton ? angular.element(document.getElementById(attrs.menuButton)) : element.parent());
var closeButton = (attrs.closeButton ? angular.element(document.getElementById(attrs.closeButton)) : false);
var toggleMenu = function(){
(opened ? element.fadeOut('fast') : element.fadeIn('fast'));
};
button.bind('click', function(event){
event.preventDefault();
event.stopPropagation();
toggleMenu();
opened = ! opened;
});
element.bind('click', function(event){
if(attrs.stayOpen && event.target != closeButton[0]){
event.preventDefault();
event.stopPropagation();
}
});
$document.bind('click', function(){
if(opened){
toggleMenu();
opened = false;
}
});
}
};
そして、ここにフィドルがあります: http://jsfiddle.net/JknUJ/5/ ボタンはコンテンツを開き、div の外でクリックするとコンテンツを閉じる必要があります。ボタン 2 をクリックしても、コンテンツ 1 は閉じません。