我有两个控制器,第二个控制器原型继承自第一个控制器。
<div ng-controller="ParentCtrl">
<div ng-controller="ChildCtrl">
</div>
</div>
ParentCtrl
有$scope.$broadcast
而ChildCtrl
有一个$scope.$on
从广播收到。
然后我决定制作一个指令,其控制器定义为ChildCtrl
。
<div ng-controller="ParentCtrl">
<div my-directive>
</div>
</div>
到目前为止,非常好,$ broadcast / $ on event仍然有效。 (纠正我,如果我错了,指令没有自己的范围,对吗?除非你将scope: true
设置为指令属性,在这种情况下,指令原型继承自ParentCtrl
? )
然后我决定隔离我的指令的范围。但是,我很惊讶地看到$ on(在指令控制器中)仍然通过$ broadcast(ParentCtrl
)接收事件。
据我了解,这不应该再起作用了,因为$ broadcast将事件向下传播给后代,在这种情况下,由于隔离范围,父子范围关系不再适用。有人可以解释一下吗?感谢。
答案 0 :(得分:2)
在你认为事件失败的部分之前,你就在哪里 无论嵌套级别如何,事件都会传播给所有子级,因此只要您有一个范围侦听特定事件,并且此事件被广播,如果您需要触发相同的事件,则会触发侦听器有选择性反应然后你可能需要考虑使用事件参数做出不同的反应
答案 1 :(得分:1)
隔离范围的原因与您提到的原因不同。它不会将子范围从父范围中删除。
将子范围与同一级别的其他子范围分开。以下示例将隔离范围真正发挥作用:
<div ng-controller="ParentCtrl">
<div my-directive></div>
<div my-directive></div>
<div my-directive></div>
</div>
为了防止my-directives在彼此之间自由使用相同的范围变量,你需要隔离它们的范围。
基本上,子范围和父范围仍然是链接的。作为演示它们仍然连接的另一个示例,您应该尝试在隔离的子作用域中执行函数,并在父作用域中定义该函数。它应该仍然在理论上运行。