这是该问题的后续问题:具有焦点的AngularJS输入会杀死list的ng-repeat过滤器
基本上,我的代码是使用AngularJS在右侧弹出一个div(抽屉)以过滤事物列表。大多数情况下使用此功能时,UI会被阻止,因此单击该阻止div会关闭抽屉。但是在某些情况下,我们不会阻止用户界面,需要允许用户在抽屉外部单击以取消搜索或选择页面上的其他内容。
我最初的想法是在抽屉打开时附加一个window.onclick处理程序,如果单击除抽屉以外的任何内容,则应关闭抽屉。这就是我将在纯JavaScript应用程序中执行的操作。但是在Angular中,这会有点困难。
下面是此示例中的相关代码。基本上,如果用户在抽屉外单击,我将调用$ scope.toggleSearch,以便将$ scope.open设置回false。
代码可以正常工作,即使$ scope.open从true变为false,它也不会修改DOM。我确定这与事件的生命周期有关,或者当我修改$
scope(因为它是来自单独的事件)时,它是副本而不是原始副本…
最终的目标将是成为最终可重用性的指令。如果有人能指出正确的方向,那我将不胜感激。
$scope.toggleSearch = function () {
$scope.open = !$scope.open;
if ($scope.open) {
$scope.$window.onclick = function (event) {
closeSearchWhenClickingElsewhere(event, $scope.toggleSearch);
};
} else {
$scope.$window.onclick = null;
}
};
和
function closeSearchWhenClickingElsewhere(event, callbackOnClose) {
var clickedElement = event.target;
if (!clickedElement) return;
var elementClasses = clickedElement.classList;
var clickedOnSearchDrawer = elementClasses.contains('handle-right')
|| elementClasses.contains('drawer-right')
|| (clickedElement.parentElement !== null
&& clickedElement.parentElement.classList.contains('drawer-right'));
if (!clickedOnSearchDrawer) {
callbackOnClose();
}
}
抽屉未关闭,因为click事件发生在摘要周期之外,并且Angular不知道$scope.open已更改。要修复它,您可以在$scope.open设置为false后调用$ scope。$apply(),这将触发摘要周期。
$scope.toggleSearch = function () {
$scope.open = !$scope.open;
if ($scope.open) {
$scope.$window.onclick = function (event) {
closeSearchWhenClickingElsewhere(event, $scope.toggleSearch);
};
} else {
$scope.open = false;
$scope.$window.onclick = null;
$scope.$apply(); //--> trigger digest cycle and make angular aware.
}
};
这是你的小提琴。
我还尝试为搜索抽屉创建一个指令(如果有帮助的话(它需要一些修复:))。这是一个JSBin。
我正在尝试隐藏按钮div和显示一个隐藏的div后,一个表单按钮已经被点击,加上延迟提交/重定向。下面是我想出的办法,但似乎没有100%奏效。 null null 任何建议都非常感谢
我创建了一个包含三个项目的菜单:menu1、menu2、Menu3。 我希望能够单击菜单内的每个按钮,并显示相关的容器。 这已经管用了。 我似乎无法使相关的在再次单击按钮时隐藏起来。 我的代码: null null
问题内容: 我有一个菜单和三个隐藏的div,这些div取决于用户选择的选项。我只想使用CSS来显示/隐藏它们。我现在正在使用jquery,但我希望禁用js即可访问它。此处有人为其他人提供了此代码,但仅在div:hover或div:active时有效,当我将其更改为div:visited时它不起作用。我是否需要添加某些内容,或者这不是正确的方法?感谢您的帮助:) 问题是我的客户希望菜单被选中时此di
问题内容: 我正在使用Angular.js应用程序,该应用程序通过医疗程序的json文件进行过滤。当使用ng- click单击(在同一页面上)过程名称时,我想显示每个过程的详细信息。这是我到目前为止的内容,.procedure-details div设置为显示:无: 我在角度上很新。有什么建议? 问题答案: 删除,然后改用: 这是小提琴:http : //jsfiddle.net/asmKj/ 您
问题内容: 我在页面上存在一个,我需要进行设置,以便当用户在该元素之外单击时它将被隐藏,但是如果用户在该元素内的某个位置单击,则它应该保留。 我尝试使用 和 将其添加到该特定DIV的click事件中,但这没有用。 谢谢! 问题答案: 在弹出式鼠标悬停时切换 标志 : 注: 如果页面上的某个地方,你有一个元素 阻止 的冒泡DOM树达(以注册),您可能希望 创建一个全屏幕 (就像一个页面叠加) 弹出包
问题内容: 我正在使用此代码: 和这个 HTML : 问题是我的链接位于内,单击时它们不再起作用。 问题答案: 遇到同样的问题,想出了这个简单的解决方案。它甚至可以递归工作: