【发布时间】:2014-02-24 11:42:06
【问题描述】:
Twitter Bootstrap dropdown 嵌套在 tr 中。 tr 可通过ng-click 进行点击。单击页面上的任意位置将折叠下拉菜单。该行为是通过$document.bind('click', closeMenu) 在指令中定义的。
因此,当打开菜单并且用户单击一行时,我希望菜单关闭(就像它一样)并且我想阻止该行上的点击事件。
JSFiddle:http://jsfiddle.net/LMc2f/1/
JSFiddle +指令内联:http://jsfiddle.net/9DM8U/1/
来自 ui-bootstrap-tpls-0.10.0.js 的相关代码:
angular.module('ui.bootstrap.dropdownToggle', []).directive('dropdownToggle', ['$document', '$location', function ($document, $location) {
var openElement = null,
closeMenu = angular.noop;
return {
restrict: 'CA',
link: function(scope, element, attrs) {
scope.$watch('$location.path', function() { closeMenu(); });
element.parent().bind('click', function() { closeMenu(); });
element.bind('click', function (event) {
var elementWasOpen = (element === openElement);
event.preventDefault();
event.stopPropagation();
if (!!openElement) {
closeMenu();
}
if (!elementWasOpen && !element.hasClass('disabled') && !element.prop('disabled')) {
element.parent().addClass('open');
openElement = element;
closeMenu = function (event) {
if (event) {
event.preventDefault();
event.stopPropagation();
}
$document.unbind('click', closeMenu);
element.parent().removeClass('open');
closeMenu = angular.noop;
openElement = null;
};
$document.bind('click', closeMenu);
}
});
}
};
}]);
我不知道如何停止 closeMenu 中的底层 ng-click 事件。
注意:我找不到访问$event 的方法,所以我无法尝试$event.stopPropagation()。
【问题讨论】:
-
@Stewie 我知道我可以在每个
a上使用ng-click="$event.stopPropagation()",但它不能解决点击任意位置折叠下拉菜单的情况,其中ng-click在绑定到$document的jQueryclick事件完成后触发调用。 -
@Stewie 你不能使用提供的 JSFiddle 解决我的问题吗?
-
因此,当打开菜单并单击行时,您希望菜单关闭(因为它确实如此)并且您想阻止行上的单击事件?
-
@Stewie 是的。确切地。但是,在函数
closeMenu、event.preventDefault()和event.stopPropagation()内部不会取消底层ng-click。我认为这是由于 jQuery 和 Angular 没有共享相同的调用堆栈。
标签: jquery angularjs twitter-bootstrap angular-ui-bootstrap angularjs-ng-click