3

为什么我使用的scope.$parent().$emit()不是scope.$emit()指令 usescope:true并且还有一个指令 use scope:true,并且它们被放置在同一个 DOM 节点上。

然后scope.$emit()也会向另一个指令发出事件,并且可以像父范围一样被捕获。但scope.$parent().$emit()只会向父级发出事件。好用scope.$parent().$emit()吗?

其他指令是否可以捕获事件似乎无关紧要,但我不确定这一点。所以在某些情况下,只有向父级发出可能是好的。
这是一个例子

“第二指令”事件只能由 MainCtrl 捕获。但是 MainCtrl 和第一个指令可以捕获“第二个指令-两个”。

4

2 回答 2

6

这是相关的问题:如何在 AngularJS 中停止 $broadcast 事件?

您可以使用

$rootScope.$broadcast('second-directive-two', 'from second');

代替

$scope.$parent().$emit('second-directive-two', 'from second');

并取消控制器中的事件处理

$scope.$on('second-directive-two',function(event,args){
    event.preventDefault();
});

first如果事件已被阻止,则不要在指令中处理事件“第二指令二”

$scope.$on('second-directive-two',function(event,args){
    if (!event.defaultPrevented) {
        // do useful job
    }
});

这是笨拙的

更新:

为什么这不是好习惯?

在这种情况下,您与 DOM 层次结构的结构相关联。想象一下,您必须将指令移动First到部分并通过ng-include. 范围层次结构已更改。$scope.$parent().$emit()从这一刻起不起作用。你花了时间来解决这个问题。

一般$scope.$parent().$emit()会生成潜在的问题代码

于 2013-11-12T10:42:59.060 回答
0

听起来您可以使用scope.$broadcast()而不是发射。就像emit,但数据在范围链中以相反的方式冒泡。

于 2013-11-12T09:35:27.273 回答