【发布时间】:2015-05-21 00:36:38
【问题描述】:
http://plnkr.co/edit/gB7MtVOOHH0FBJYa6P8t?p=preview
我上面有一个父子控制器示例,在子中单击按钮时,我会显示 div showPop,然后将 $emit 一个事件向上传递到 $rootScope。
现在在父/$rootScope我“听到”那个事件然后激活另一个功能。
$rootScope 中的那个函数会触发 bodyClick 的点击函数处于活动状态,因此一旦在 body/parent/rootScope 中注册了一次点击,div showPop 现在就被隐藏了。
问题是,虽然我希望点击 body 以关闭该 div,但我不希望点击实际 div 本身来触发它关闭?
我怎样才能完成这个/解决$rootScope ng-click 事件?
.controller('mainController', ['$scope', '$rootScope',
function($scope,$rootScope) {
var unbind = $rootScope.$on('popoverOpen');
$scope.$on('popoverOpen', function(events, data) {
console.log('popoverOpen is heard!')
$scope.bodyClick = function() {
console.log('bodyClick sent down from main');
$scope.theAction = 'bodyClick sent down from main';
$rootScope.$broadcast('bodyClick');
};
$scope.$on('$destroy', unbind);
});
}])
.controller('subController', ['$scope', '$rootScope',
function($scope, $rootScope) {
$scope.callPop = function($event) {
$rootScope.theAction = 'popoverOpen emitted up from sub';
$event.stopPropagation();
$scope.showPop = true;
$scope.$emit('popoverOpen');
};
$scope.$on('bodyClick', function() {
console.log('bodyClick received in sub!');
$rootScope.theAction = 'bodyClick received in sub!';
$scope.showPop = false;
$scope.$emit('destroy');
});
}]);
标记:
<body ng-app="app" ng-controller="mainController" ng-click="bodyClick()">
<h1>mainController</h1>
<div class="sidebar" ng-controller="subController">
<h2>subController</h2>
<button ng-click="callPop($event)">Click Me</button>
<div ng-show="showPop" class="pop-box">This is showPop, clicking in here should not close it, clicking outside should!</div>
</div>
<section class="the-section">
{{theAction}}
</section>
</body>
【问题讨论】:
-
如果您不想点击正文。你为什么不尝试一些有覆盖的东西?单击覆盖会关闭弹出窗口并阻止单击继续?
-
@Okazari 啊真的!所以我想嗯......是的,我可以在我所有的弹出框下有另一个指令元素来处理这个......哈哈,我想我让事情变得太难了。
-
@DRobinson 我现在正在使用停止传播,它也可以防止对子的单击也充当对主体的单击。问题是在事件被激活后,对 body 的点击现在总是在 sub 之前首先被注册。
-
@Okazari:点击叠加层
标签: javascript angularjs angularjs-scope angularjs-ng-click