首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >取消嵌套的ng-click调用之间的事件传播的最佳方式是什么?

取消嵌套的ng-click调用之间的事件传播的最佳方式是什么?
EN

Stack Overflow用户
提问于 2013-03-04 10:15:12
回答 10查看 155.3K关注 0票数 186

下面是一个例子。比方说,我想要一个像很多网站一样的图像覆盖。因此,当您单击缩略图时,会在整个窗口上显示一个黑色覆盖图,并且图像的放大版本会居中显示。单击黑色覆盖会将其取消;单击图像将调用显示下一图像的函数。

html:

代码语言:javascript
复制
<div ng-controller="OverlayCtrl" class="overlay" ng-click="hideOverlay()">
    <img src="http://some_src" ng-click="nextImage()"/>
</div>

javascript:

代码语言:javascript
复制
function OverlayCtrl($scope) {
    $scope.hideOverlay = function() {
        // Some code to hdie the overlay
    }
    $scope.nextImage = function() {
        // Some code to find and display the next image
    }
}

问题是,使用此设置时,如果单击图像,将同时调用nextImage()hideOverlay()。但我想要的是只调用nextImage()

我知道您可以在nextImage()函数中捕获和取消事件,如下所示:

代码语言:javascript
复制
if (window.event) {
    window.event.stopPropagation();
}

我想知道是否有一种更好的AngularJS方法,它不需要我在覆盖图中的元素上添加所有函数的前缀,使用下面的代码片段。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2013-03-04 10:30:50

或者将$event对象传递到ng-click回调中并停止其内部的传播:

代码语言:javascript
复制
<div ng-controller="OverlayCtrl" class="overlay" ng-click="hideOverlay()">
  <img src="http://some_src" ng-click="nextImage($event)"/>
</div>
代码语言:javascript
复制
$scope.nextImage = function($event) {
  $event.stopPropagation();
  // Some code to find and display the next image
}
票数 197
EN

Stack Overflow用户

发布于 2013-03-04 10:19:24

使用$event.stopPropagation()

代码语言:javascript
复制
<div ng-controller="OverlayCtrl" class="overlay" ng-click="hideOverlay()">
    <img src="http://some_src" ng-click="nextImage(); $event.stopPropagation()" />
</div>

这是一个演示:http://plnkr.co/edit/3Pp3NFbGxy30srl8OBmQ?p=preview

票数 173
EN

Stack Overflow用户

发布于 2013-11-08 04:52:59

我喜欢对此使用指令的想法:

代码语言:javascript
复制
.directive('stopEvent', function () {
    return {
        restrict: 'A',
        link: function (scope, element, attr) {
            element.bind('click', function (e) {
                e.stopPropagation();
            });
        }
    };
 });

然后使用如下指令:

代码语言:javascript
复制
<div ng-controller="OverlayCtrl" class="overlay" ng-click="hideOverlay()">
    <img src="http://some_src" ng-click="nextImage()" stop-event/>
</div>

如果您愿意,可以使此解决方案更通用,就像下面这样回答不同的问题:https://stackoverflow.com/a/14547223/347216

票数 101
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15193539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档