我想要一个在单击元素外部时调用函数的指令。 用于打开菜单的用例,点击其外部时点击和关闭。
该指令将onlick绑定到窗口以ckeck元素外部的点击,但是onclick函数获取最后一个范围,而不是" right"范围
http://plnkr.co/edit/ePKMMsbe9HYikY9XQ1u3?p=preview
app.directive('clickanywherebuthere', ['$document', '$timeout', function($document, $timeout) {
return {
link: function postLink(scope, element, attrs) {
onClick = function(event) {
var isChild = element.has(event.target).length > 0;
var isSelf = element[0] == event.target;
var isInside = isChild || isSelf;
if (!isInside)
scope.$apply(attrs.clickanywherebuthere)
}
scope.$watch(attrs.isActive, function(newValue, oldValue) {
if (newValue !== oldValue && newValue == true) {
$timeout(function() { $document.bind('click', onClick) })
}
else if (newValue !== oldValue && newValue == false) {
$document.unbind('click', onClick);
}
});
}
};
}])
答案 0 :(得分:1)
问题是onClick仅在第一次调用指令时被创建,并且它被绑定到第一个按钮的范围。你需要添加" var"在" onClick"前面使其正常工作。我在下面修改了你的plnkr:
答案 1 :(得分:0)
也许最好不要通过指令的链接功能来监听指令外的点击。我建议您为页面上的点击添加一个全局侦听器,该点击广播所点击的元素的名称(根据您喜欢的任何内容),并使指令监听这些事件的范围。$ on(' name-of -event&#39);
在应用程序的运行阶段,添加广播所点击元素值的点击监听器
angular.module('test').run(function($rootScope){
$(document).click(function(event){
$rootScope.$broadcast('clickanywhere',event.target.nodeName)
})
})