使用 outsideClick 关闭自定义指令弹出框

Use outsideClick to close custom directive popover

提问人:Kandianne Pierre 提问时间:3/19/2016 更新时间:3/24/2016 访问量:609

问:

我有一个弹出窗口作为自定义指令,当单击或悬停图标时会打开。单击该图标时,弹出框会粘住,如果再次单击该图标,弹出框将关闭。现在我想在单击弹出框以外的其他任何地方单击弹出框后关闭弹出框。下面是我的代码...

我的自定义指令

(function () {
  'use strict';

  angular.module('frontend.core.directives')
    .directive('myPopover', [
      function directive() {
        return {
          restrict: 'E',
          templateUrl: '/frontend/core/directives/my-popover/my-popover.html',
          scope: {
            trigger: '@',
            title:'@'
          },
          transclude: true,
          link: function (scope, elm, attrs) {
            //Need to hide content first
            elm.hide();
            //plugin binder
            $(scope.trigger).popover({
              html: true,
              trigger: 'hover click',
              placement: 'auto',
              content: function () {
                return elm.html();
              },
              title: function () {
                return scope.title;
              }
            });

          }
        };
      }
    ]);
}());

我的 HTML

<div>
<i id="touch-details" class="fa fa-info-circle"></i>
<my-popover trigger="#touch-details" my-popover-trigger="outsideClick" title="Details">
    <span>
       Inside of my popover
    </span>
</my-popover>
</div>

请告诉我在单击外部时需要做什么才能关闭弹出框。

javascript angularjs twitter-bootstrap popover using-directives

评论

0赞 Brent McFerrin 3/19/2016
如果您的弹出框后面有某种覆盖层,您可以随时检查该覆盖层是否已被单击。像这样:在你的指令中overlay.on('click', function() {myPopover.close();});

答:

0赞 jstuartmilne 3/19/2016 #1

尝试注入 $document 输入指令并控制在天气事件中,单击是在 div 内部,在保持弹出窗口或外部。所以像这样的东西:

angular.module('frontend.core.directives')
    .directive('myPopover', [
      function directive($document) {

.......

  $document.on('click', function(event){

     event.originalEvent //This holds among other things where the click was made. If click was not made in the div containing the popup, then take an action
});

希望对您有所帮助

0赞 Yoan 3/19/2016 #2

有一个名为 popover-trigger 的属性,您可以在模糊事件上分配属性焦点,该焦点可以根据需要工作。此外,使用 ui-bootstrap,您可以轻松地将 bootstrap 的弹出窗口和工具提示与 angularjs 一起使用,如下例所示:

<button popover-placement="top" 
        popover-title="Hello Word!"
        popover-class = "someClass"
        popover-trigger = "focus"
        uib-popover="I appeared on blur!"
        type="button" class="btn btn-default">
        Check
</button> 
0赞 Kandianne Pierre 3/24/2016 #3

实际上,答案已经创建出来了。只需要稍微调整一下以匹配 Angular 语法。因此,“$”被更改为“angular.element”。 例如。。。

$('body').on('click'

相当于

angular.element('body').on('click'

看链接...

http://jsfiddle.net/raving/jpsmegvL/