Angularjs 确定角度应用程序的单击方法的范围

Angularjs 确定角度应用程序的单击方法的范围,angularjs,Angularjs,我有一个角度的应用程序,我在其中显示一些菜单栏点击图标。我正在使用一个范围变量,并使用ng show显示/隐藏该变量。它工作正常,但有一个新的要求,即如果有人单击应用程序的任何其他部分,菜单应该关闭。现在的问题是,当我在主体中使用ng单击时,它会触发两种作用域方法,即图标单击和主体单击,因为图标也在主体中。我应该采取什么方法?我需要一个不同的控制器吗?在单击事件中,您需要确保目标不是图标(考虑排除菜单本身) 大概是这样的: $document.on('click', function (even

我有一个角度的应用程序,我在其中显示一些菜单栏点击图标。我正在使用一个范围变量,并使用ng show显示/隐藏该变量。它工作正常,但有一个新的要求,即如果有人单击应用程序的任何其他部分,菜单应该关闭。现在的问题是,当我在主体中使用ng单击时,它会触发两种作用域方法,即图标单击和主体单击,因为图标也在主体中。我应该采取什么方法?我需要一个不同的控制器吗?

在单击事件中,您需要确保目标不是图标(考虑排除菜单本身)

大概是这样的:

$document.on('click', function (event) {
                if (event.pageX == 0 && event.pageY == 0) return;

                var target = event.target || event.srcElement;
                if (!(elm.contains(target))) {
                    // close the menu
                }
            });
elm是您的图标元素


也可以考虑在一个添加到主体的关闭侦听器中使用诸如:

< P>这样的指令,检查事件不是来自您的图标:

var closeListener = function(event) {
    if (!iconElement.contains(event.target)) {
        closeMenu();
    }
};

这里的问题是,当从主体触发事件时,只有在打开菜单时才应关闭菜单。如果从图标触发,则菜单应在关闭时打开,在打开时关闭。现在从你的答案中得到一个提示,如果我把逻辑写为:if(!(elm.contains(target)){//如果关闭就打开菜单,反之亦然}否则{如果打开就关闭菜单}。此事件被触发两次,因此首先出现菜单,然后关闭。我目前使用的是ng click而不是指令。我建议检查我链接到的指令。它提供了您需要的功能:单击将关闭菜单,您可以排除元素。问题是,单击偶数被触发两次。一次用于父容器,另一次用于子容器。因此,菜单将打开,然后关闭。