我制作了一个自定义(ul li)下拉指令。
大部分内容都是通过以下代码完成的(关闭和打开部分)。
scope.closeDropDown = function () {
scope.isOpened = false;
$document.unbind('click');
};
//The part for opening and closing is pressed
scope.openDropDown = function () {
if (scope.isOpened) {
//The dropdown is already opened, close it
scope.closeDropDown();
} else {
//Open the dropdown, and add an event handler to the document
scope.isOpened = true;
$document.bind('click', function (evt) {
var target = $(evt.target);
// Check if the document clicked element is a child of the directive
// ATTENTION HERE
if (!target.parents('dropdown').length) {
//Target is not a child element, close the dropdown
scope.closeDropDown();
scope.$apply();
}
});
}
};
仔细阅读此处的注意事项 在这里,我在整个页面上设置了一个事件监听器。使用它会给我带来以下问题:
示例:当有多个下拉列表时(例如A和B)。
如何检查event.target是否为angular.element的子项?
现在我只是checkig,如果event.target是下拉指令的子项(这仅在使用1下拉指令时有效)!
答案 0 :(得分:2)
根据Zia Ul Rehman Mughal的要求,我将使用我自己的下拉指令中的答案更新问题。
我犯错的部分是在打开下拉列表时添加点击监听器,并在关闭时再次将其删除。 这是错误的!
您必须在创建对象时添加侦听器,并在对象被销毁时再次删除它们(使用角度$destroy
事件。
要检查点击的目标是否是元素的子元素,您可以使用length
的{{1}}属性
$element.find(event.target)