为什么我使用scope.$parent().$emit()
以外的scope.$emit()
是指令使用scope:true
并且还有一个指令使用scope:true
,并且它们被放置在同一个DOM节点上。
然后scope.$emit()
也会向其他指令发出事件,并且可以像父作用域一样捕获。但scope.$parent().$emit()
只会向父母发出事件。使用scope.$parent().$emit()
是否合适?
其他指令是否可以捕捉到这个事件似乎无关紧要,但我对此并不确定。所以 ONLY 向父母发出的声音在某些情况下可能会很好。
这是一个例子plunk
“second-directive”事件只能被MainCtrl捕获。但是“第二指令二”可以被MainCtrl和第一指令捕获。
答案 0 :(得分:6)
以下是相关问题:How to stop $broadcast events in AngularJS?
您可以使用
$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
指令中处理事件'second-directive-two'
$scope.$on('second-directive-two',function(event,args){
if (!event.defaultPrevented) {
// do useful job
}
});
这是plunk
<强>更新强>
为什么这不是好习惯?
在这种情况下,您将与DOM层次结构相关联。想象一下,您必须将指令First
移动到部分并通过ng-include
包含它。范围层次结构已更改。从这一刻开始,$scope.$parent().$emit()
无效。你花时间来解决这个问题。
通常$scope.$parent().$emit()
会生成潜在的问题代码
答案 1 :(得分:0)
听起来你可以使用scope.$broadcast()
而不是发射。它就像emit
,但数据在范围链中反过来。