gpt4 book ai didi

javascript - Angular js 停止从 Bootstrap "dropdown-toggle"事件传播

转载 作者:数据小太阳 更新时间:2023-10-29 04:04:16 25 4
gpt4 key购买 nike

我有一个 Angular JS 1.3 应用。

在其中我有一个带有 ng-click 的表格行转发器:

<tr ng-repeat-start="user in users.users" ng-click="showDetails = !showDetails">
<!-- main row, with the menu td shown below -->
<tr class="row-details" ng-show="showDetails" ng-class="{ 'active': showDetails }">
<td>this is the row that hows details</td>
</tr>
<tr ng-repeat-end></tr>

切换打开详细 View 。工作正常。但现在我需要在每个 td 中添加另一个项目,一个 Bootstrap 按钮菜单:

<td>
<div class="btn-group">
<div ng-switch on="user.status">
<button class="btn btn-link btn-gear dropdown-toggle" type="button" data-toggle="dropdown"><i class="fa fa-cog"></i></button>

<ul class="dropdown-menu dropdown-menu-right" role="menu" ng-switch-when="Inactive">
<li><a href="" ng-click="users.modals.deleteUser()">Delete</a></li>
</ul>

<ul class="dropdown-menu dropdown-menu-right" role="menu" ng-switch-when="Invited">
<li><a href="" ng-click="users.toast.resendInvite()">Resend invitation</a></li>
<li><a href="" ng-click="users.modals.deleteUser()">Delete</a></li>
</ul>

<ul class="dropdown-menu dropdown-menu-right" role="menu" ng-switch-default>
<li><a href="" ng-click="users.toast.sentPassword()">Reset password</a></li>
<li><a href="" ng-click="users.modals.deleteUser()">Delete</a></li>
</ul>
</div>
</div>
</td>

问题是,尝试单击此菜单按钮反而会触发行上的 ng-click,切换行状态但从未打开我的菜单。我怎样才能避免这种情况?

最佳答案

这是一个非常棘手的问题。问题是,当您单击菜单按钮时,会发生两件事:第一件事是打开 Bootstrap 下拉菜单,第二件事是事件传播到父元素并触发 showDetails = !showDetails

明显的解决方案是尝试在 td 级别使用 $event.stopPropagation() 停止事件传播,这样事件就不会在 DOM 树中冒泡并且永远不会触发父 ngClick。不幸的是,它不会工作,因为 Bootstrap 在 document 元素上设置了点击事件监听器以从冒泡中获益,所以你不能停止传播。

在这种情况下,我想出的最简单的解决方案是在原始事件对象上设置一个标志,以确定事件是否发生在菜单按钮上。如果是这种情况,tr 上的 ngClick 将不会执行任何操作。

tr 看起来像这样:

<tr ng-repeat-start="user in users.users" ng-click="$event.originalEvent.dropdown || (showDetails = !showDetails)">

按钮的答案:

<button ng-click="$event.originalEvent.dropdown = true" class="btn btn-link btn-gear dropdown-toggle" type="button" data-toggle="dropdown">
<i class="fa fa-cog"></i>
</button>

演示: http://plnkr.co/edit/eIn6VW3Y2jHn0MtJQVcU?p=preview

关于javascript - Angular js 停止从 Bootstrap "dropdown-toggle"事件传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30292568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com