如何为 uib-popover 使用不同的触发器组合?

Posted

技术标签:

【中文标题】如何为 uib-popover 使用不同的触发器组合?【英文标题】:How to use a different combination of triggers for uib-popover? 【发布时间】:2016-08-15 20:32:23 【问题描述】:

https://angular-ui.github.io/bootstrap/#/popover 的官方文档说,以下触发器组合可以作为参数传递给popover-trigger 属性:

mouseenter: mouseleave
click: click
outsideClick: outsideClick
focus: blur
none

我想使用组合

mouseenter: outsideClick

如何在不使用popover-is-open 属性的情况下实现这一点?

【问题讨论】:

您希望弹出框在鼠标输入时出现并在元素单击时消失? 是的。但稍作修正,我希望它在外部点击时消失。 在这里找到了解决方案:***.com/a/35810720/3811693 这个答案符合我的目的。 【参考方案1】:

你不能,文档状态

outsideClick 触发器将导致弹出框在单击时切换,并在单击其他任何内容时隐藏。

“任何其他”包括元素本身,因此使用outsideClick 切换元素打开或关闭会干扰其他触发器的自然行为。

例如,如果像这样声明您的触发器popover-trigger="mouseleave outsideClick" ,如果您已经单击了元素,触发器mouseleave 将隐藏弹出窗口而不是显示它,否则它只会在离开时显示它。 (plunk)。

如果您可以使用 popover-is-open 破解它,然后继续这样做,如果它太困扰您,您可以随时请求一个功能。

【讨论】:

【参考方案2】:

popover-trigger="mouseenter outsideClick"uib-popover 指令似乎不像人们想象的那样工作。

最初,我认为它的含义如下:

    鼠标输入显示弹出框 鼠标离开时隐藏弹出框 点击时保持弹出框处于活动状态 如果处于活动状态,则在外部单击关闭弹出窗口

由于我不需要手动方法,因此文档中说明了以下内容。

对于任何不受支持的值,触发器将用于显示和隐藏弹出框。使用“无”触发器将禁用内部触发器,然后可以使用 popover-is-open 属性专门显示和隐藏弹出框。

所以我创建了一些 html,例如:

  <span class="glyphicon glyphicon-info-sign" 
      ng-class="'text-primary' : isInfoPopoverClicked"
      ng-click="toggleInfoPopoverClicked()"
      ng-mouseenter="enterInfoPopover()"
      ng-mouseleave="leaveInfoPopover()"
      custom-click-outside="closeInfoPopover()"
      uib-popover-template="'info.html'"
      popover-trigger="'none'"
      popover-is-open="isInfoPopoverOpen()"
      popover-placement="auto top"
      popover-append-to-body="true" >
  </span>

控制器中的JS:

  // Toggle popover's clicked active state
  $scope.toggleInfoPopoverClicked = function() 
    $scope.isInfoPopoverClicked = !$scope.isInfoPopoverClicked;
  ;
  // Close the popover, used for outside click and close action inside the template
  $scope.closeInfoPopover = function() 
    delete $scope.isInfoPopoverClicked;
  ;
  // On mouse enter, show the popover
  $scope.enterInfoPopover = function() 
    $scope.isInfoPopoverMouseEnter = true;
  ;
  // On mouse leave, close the popover.
  // If clicked active state is false set to undefined.
  // This supports when the user clicks the icon to close, 
  // that mouse enter does not immediately display the popover again.
  $scope.leaveInfoPopover = function() 
    $scope.isInfoPopoverMouseEnter = false;
    if(false === $scope.isInfoPopoverClicked) 
      delete $scope.isInfoPopoverClicked;
    
  ;
  // Expression used in the popover-is-open attribute
  $scope.isInfoPopoverOpen = function() 
    if($scope.isInfoPopoverClicked) 
      return true;
     else if(false === $scope.isInfoPopoverClicked)
      return false;
    
    return $scope.isInfoPopoverMouseEnter;
  ;

我使用的uib-popover-template的模板:

  <div custom-stop-event="click" class="pull-right">
   <span ng-click="closeInfoPopover()" class="glyphicon glyphicon-remove"></span>
   <section>info</section>
  </div>

现在更棘手的部分是这个解决方案需要我再创建两个指令。

    在元素外部单击时关闭弹出框。 另一个停止在弹出窗口内触发的点击事件。阻止它关闭弹出框。

custom-click-outside 指令:

angular.module('LSPApp').directive('customClickOutside', ['$document', function ($document) 
return 
    restrict: 'A',
    scope: 
        clickOutside: '&customClickOutside'
    ,
    link: function (scope, element) 
        var handler = function (event) 
            if (element !== event.target && !element[0].contains(event.target)) 
                scope.$applyAsync(function () 
                    scope.clickOutside();
                );
            
        ;

        // Might not work on elements that stop events from bubbling up
        $document.on('click', handler);

        // Clean up event so it does not keep firing after leaving scope
        scope.$on('$destroy', function() 
            $document.off('click', handler);
        );
    
;
]);

从模板的 HTML 调用的 custom-stop-event 指令:

angular.module('LSPApp').directive('stopEvent', function () 
return 
  restrict: 'A',
  link: function (scope, element, attr) 
    element.on(attr.stopEvent, function (e) 
      e.stopPropagation();
    );
  
;
);

希望这对某人有所帮助,我的最终解决方案已将所有这些封装在它自己的指令中以促进重用。

【讨论】:

以上是关于如何为 uib-popover 使用不同的触发器组合?的主要内容,如果未能解决你的问题,请参考以下文章

如何为不同的观察组使用 LAG 和 LEAD 窗口函数

如何为 pandas 数据框中的不同组分配唯一 ID?

Xcode:如何为指向两个不同团队帐户(企业和公司)的两个不同目标选择两个不同的应用程序组

如何为不同的请求建模不同类型的表单

如何为 Avalonia 中的每个平台/操作系统定义一组单独的样式?

如何为 didSelectRowAtIndexPath 中的选定笔尖单元触发某些 segue