我正在定义一个指令,该指令通过解释定义为数组中对象的菜单项列表来构建菜单。
菜单将打开并显示正常。这是一个弹出菜单:它显示在需要覆盖的页面任何部分上方的前景中。目前为止,一切都好。
但是,我想在用户单击菜单外部后立即隐藏菜单。为此,我使用了这个问题的答案来构建它:
$scope.closeOnClick = function($scope) {
var $menu = $('#menu-view');
$(document).on('click', function(event) {
if (!$(event.target).closest('#menu-view').length) {
if ($menu.is(":visible")) {
$scope.hideMenu();
}
}
});
}
hideMenu
是在控制打开和关闭菜单的切换按钮的控制器中定义的函数。
这个closeOnClick
函数就是在那个控制器中定义的。它也在那里被调用,以便"安装"单击处理程序。
不幸的是,$scope.hideMenu()
似乎无效,控制台中没有报告任何错误。我也尝试使用Angular事件,广播/打开,但无济于事。
我正在寻找想法。谢谢。
这是一个经典的角度问题。DOM 事件处理程序不在 Angular 生命周期内运行,这就是您需要使用 $scope.apply
的原因。顺便说一句,你应该使用angular.element()而不是普通的jquery。
if ($menu.is(":visible")) {
$scope.apply($scope.hideMenu);
}
我没有看到你的hideMenu函数,但我想要让你的代码工作,你需要在$scope.hideMenu();
后添加$scope.$apply();
但这是非角度方法,最好使用以下内容:
<button ng-click="hideButton=true" ng-if="!hideButton">Button to hide</button>