是范围。$ parent。$ emit()只是向父范围发出事件的好习惯吗?

时间:2013-11-12 09:30:08

标签: angularjs angularjs-directive

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

然后scope.$emit()也会向其他指令发出事件,并且可以像父作用域一样捕获。但scope.$parent().$emit()只会向父母发出事件。使用scope.$parent().$emit()是否合适?

其他指令是否可以捕捉到这个事件似乎无关紧要,但我对此并不确定。所以 ONLY 向父母发出的声音在某些情况下可能会很好。
这是一个例子plunk

“second-directive”事件只能被MainCtrl捕获。但是“第二指令二”可以被MainCtrl和第一指令捕获。

2 个答案:

答案 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,但数据在范围链中反过来。