$scope.$on 在隔离范围
$scope.$on in Isolate scope
我有两个控制器,第二个原型继承自第一个。
<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 事件仍在运行。 (如果我错了请纠正我,该指令没有自己的范围,对吗?除非您将 scope: true
设置为指令 属性,在这种情况下,该指令原型继承自 ParentCtrl
?)
然后我决定隔离指令的范围。但是,令我惊讶的是 $on(在指令控制器中)仍然通过 $broadcast(在 ParentCtrl
中)接收事件。
据我所知,这应该不再有效,因为 $broadcast 将事件向下传播到后代,并且在这种情况下,由于隔离范围,父子范围关系不再适用。有人可以解释一下吗?谢谢。
在您认为活动无效的那部分之前,您是对的
无论嵌套级别如何,事件都会传播到所有子级,因此只要您有一个侦听特定事件的范围并且此事件是 $broadcasted 如果您需要触发相同的事件,就会触发侦听器并且有选择性的反应那么你可能需要考虑使用事件参数来做出不同的反应
隔离作用域的原因与您提到的不同。这并不是要将子作用域从父作用域中分离出来。
这是为了让子范围与同一级别的其他子范围分开。以下示例是隔离作用域真正发挥作用的地方:
<div ng-controller="ParentCtrl">
<div my-directive></div>
<div my-directive></div>
<div my-directive></div>
</div>
为了防止 my-directives 在彼此之间自由使用相同的范围变量,您需要隔离它们的范围。
基本上,子作用域和父作用域仍然是链接的。作为证明它们仍然连接的进一步示例,您应该尝试在隔离的子作用域中执行一个函数,并在父作用域中定义该函数。理论上应该还是运行。
我有两个控制器,第二个原型继承自第一个。
<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 事件仍在运行。 (如果我错了请纠正我,该指令没有自己的范围,对吗?除非您将 scope: true
设置为指令 属性,在这种情况下,该指令原型继承自 ParentCtrl
?)
然后我决定隔离指令的范围。但是,令我惊讶的是 $on(在指令控制器中)仍然通过 $broadcast(在 ParentCtrl
中)接收事件。
据我所知,这应该不再有效,因为 $broadcast 将事件向下传播到后代,并且在这种情况下,由于隔离范围,父子范围关系不再适用。有人可以解释一下吗?谢谢。
在您认为活动无效的那部分之前,您是对的 无论嵌套级别如何,事件都会传播到所有子级,因此只要您有一个侦听特定事件的范围并且此事件是 $broadcasted 如果您需要触发相同的事件,就会触发侦听器并且有选择性的反应那么你可能需要考虑使用事件参数来做出不同的反应
隔离作用域的原因与您提到的不同。这并不是要将子作用域从父作用域中分离出来。
这是为了让子范围与同一级别的其他子范围分开。以下示例是隔离作用域真正发挥作用的地方:
<div ng-controller="ParentCtrl">
<div my-directive></div>
<div my-directive></div>
<div my-directive></div>
</div>
为了防止 my-directives 在彼此之间自由使用相同的范围变量,您需要隔离它们的范围。
基本上,子作用域和父作用域仍然是链接的。作为证明它们仍然连接的进一步示例,您应该尝试在隔离的子作用域中执行一个函数,并在父作用域中定义该函数。理论上应该还是运行。