【发布时间】:2015-07-27 20:01:36
【问题描述】:
Plnkr 示例构建:http://plnkr.co/edit/gB7MtVOOHH0FBJYa6P8t?p=preview
Following the answer here,我创建了一些$broadcast 事件以允许主$scope 中的操作关闭子$scopes 中的弹出框。但是我想确保我清理了所有的事件,并且没有任何不应该的东西挥之不去。
我有一个 popover 指令,一旦 popover 被激活,我就会发送出去:
vs.$emit('popoverOpen');
然后在主应用模块($rootScope)中,我在这里监听:
vs.$on('popoverOpen',function(events,data) {
// if 'popoverOpen' is heard, then activate this function
// which on click $broadcasts out even 'bodyClick'
// but also destroy the 'popoverOpen' event
vs.bodyClick = function() {
$rootScope.$broadcast('bodyClick');
$rootScope.$$listenerCount.popoverOpen=[];
};
});
回到 popover 指令,这里是我的bodyClick 监听器:
vs.$on('bodyClick', function() {
vs.searchPopoverDisplay = false;
$rootScope.$$listenerCount.bodyClick=[];
});
^ 我也有代码试图杀死bodyClick 事件,但无济于事:(
如下所示,我已从 $$listenerCount 中删除了 bodyClick 和 popoverOpen($$listener 对象中从未有任何内容。
但是,即使 popoverOpen 应该已被删除,用户仍然可以访问主应用 rootScope 中的 vs.bodyClick() 函数。
所以在第一次加载时:
- 如果用户在没有打开任何弹出框的情况下点击周围,
bodyClick永远不会被捕获/传输 - 打开弹出框后,
bodyClick处于活动状态 - 如果用户点击正文,则发送该事件并关闭弹出框
- 但是,现在即使没有打开任何弹出框,如果用户点击正文,
bodyClick事件就会不断发送出去
在发送bodyClick 事件以关闭弹出框后,您将如何正确删除这些事件?
更新 我也试过这个(https://github.com/toddmotto/angularjs-styleguide#publish-and-subscribe-events),但在弹出框关闭并被销毁后,bodyClick 事件仍然不断发送出去。
popoverDirective 函数仍然被调用:
vs.$on('bodyClick', function() {
console.log('bodyClick received ...');
console.log($rootScope.$$listener);
console.log($rootScope.$$listenerCount);
vs.searchPopoverDisplay = false;
var unbind = $rootScope.$on('popoverOpen', []);
vs.$on('$destroy', unbind);
// $rootScope.$$listenerCount.bodyClick=[];
});
【问题讨论】:
-
Todd Motto 的 Angular 指南中有一个注释,其中提到了销毁发布和订阅事件。这可能是您正在寻找的。 github.com/toddmotto/…
-
谢谢!嗯,我尝试了他的
destroy代码,但没有用.. 还必须在那里修复语法错误,但仍然没有运气...添加了我上面尝试的内容。 -
现在构建一个 plnkr 示例 plnkr.co/edit/gB7MtVOOHH0FBJYa6P8t?p=preview
-
所以,我在您的 plunkr 中为您的
$destroy侦听器添加了一个控制台,但它永远不会被调用。所以我在你的bodyClick电话之后添加了一个$scope.$destroy(),然后噗!没有更多的警报。不确定它是否具有所需的后效...my plunkr
标签: javascript angularjs angularjs-directive angularjs-scope