javascript - AngularJS 适当的事件与 parent 和 child 的指令出价

标签 javascript angularjs events angularjs-directive event-propagation

我正在尝试实现显示它的弹出窗口和按钮。 我是通过指令来做到这一点的:

<div class="wrapper" wrapper>
  <div class="popup" ng-class="{'popup__active':isActive}">
    Popup message
  </div>
  <button btn>Click me</button>
</div>

当弹出窗口可见时,我需要能够通过单击弹出窗口之外的任意位置来关闭它。

var app = angular.module('plunker', []);

app.controller('MainCtrl', function($scope) {

});

app.directive('wrapper', function($rootScope, $timeout) {
  return {
    link: function($scope, $element) {
      $rootScope.$on('btnclick', function() {
        $scope.isActive = true;
        $scope.$digest();
        $element.bind('click', function() {
          $scope.isActive = false;
          $element.unbind('click');
          $scope.$digest();
        });

      });
    },
  }
});

app.directive('btn', function($rootScope) {
  return {
    link: function($scope, $element) {
      $element.bind('click', function() {
        $rootScope.$broadcast('btnclick');
      });
    },
  }
});

这段代码有问题。 当我单击按钮时,它会显示弹出窗口并立即将其隐藏,因为在 wrapper 链接函数中触发了“click”事件。 但是只有在显示弹出窗口并且我点击它之外的任何地方后才应该触发该点击事件。

查看代码:http://plnkr.co/edit/wRbbB7rdgLSaQDZQQEc1

注意:不幸的是,由于复杂的 CSS 依赖,无法在实际项目中更改布局。所以我正在寻找如何使用 angular 正确绑定(bind)元素。

最佳答案

根据您当前的结构,您的父元素和子元素都有 click 事件。当您单击任何内部元素时,它会调用该元素的 click 事件,然后由于父元素具有相同的事件而冒泡该事件。为防止这种行为,您必须使用 event.stopPropagation() 这将防止在点击事件时冒泡(将事件发送到其父元素)。

指令

app.directive('btn', function($rootScope) {
  return {
    link: function($scope, $element) {
      $element.bind('click', function(e) {
        e.stopPropagation(); //stop bubbling up of event
        $rootScope.$broadcast('btnclick');
      });
    },
  }
});

Demo Plunkr

关于javascript - AngularJS 适当的事件与 parent 和 child 的指令出价,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30953826/

相关文章:

javascript - 循环遍历 mongodb 文档 id 数组并查询该 id 并将结果存储在新数组中给出空数组

javascript - 如何使用angularjs通过单击按钮将图像下载到我们的本地?

php - 如何通过php更改mysql分隔符

c# - 我的通用 Future 实现是否应该有一个 Completed 事件?

javascript - 通过点击段落随机背景颜色。我的代码给出了一个错误

javascript - event.preventDefault() 持续多久?

javascript - 如何更改 amchart 中的气球文本

javascript - 如何使用无法删除的值初始化输入,但允许用户在输入后写入

javascript - 使用所选的选择选项使用 angularjs 解析 JSON

javascript - 如何在 HTML 中显示 Firebase 查询结果(未定义错误)