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

Ste*_*eve 8 javascript twitter-bootstrap angularjs

我有一个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>
Run Code Online (Sandbox Code Playgroud)

其中切换打开详细视图.工作良好.但是现在我需要在每个tds中添加另一个项目,一个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>
Run Code Online (Sandbox Code Playgroud)

问题是,尝试单击此菜单按钮而不是触发行上的ng-click,切换行状态但从不打开我的菜单.我怎么能阻止这个?

dfs*_*fsq 16

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

显而易见的解决方案是尝试$event.stopPropagation()td级别上停止事件传播,以便事件不会冒出DOM树并且永远不会触发父级ngClick.不幸的是,它不起作用,因为Bootstrap在document元素上设置click事件监听器以受益于冒泡,因此您无法阻止传播.

在这种情况下我提出的最简单的解决方案是在原始事件对象上设置一个标志,无论事件是否发生在菜单按钮上.如果是这种情况ngClicktr不会做任何事情.

它看起来像这样tr:

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

ans for button:

<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>
Run Code Online (Sandbox Code Playgroud)

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