$onDestroy 和 $scope.$destroy() 之间的 Angular 1.5 组件差异

Yas*_*ila 2 javascript scope angularjs angular-components

我试图了解控制器的$onDestroy方法和$scope.$destroy()之间的区别。

定义表示,当需要销毁组件的包含范围时调用 $onDestroy。但是$scope.$destroy() 不是一样的情况吗?

根据我在https://plnkr.co/edit/9RlS8OLxAoyK80WPMJaN?p=preview创建的 plunker ,

<div ng-controller="ParentController">
    <button ng-click="func()">Parent</button>
    <br><br>
    <div ng-controller="ChildController">
      <button ng-click="childFunc()"> Child </button>
      <br><br>
      <comp> </comp>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

我注意到两种情况。

  1. 当我从父控制器或子控制器调用 $destroy() 时,组件中会触发 $onDestroy 和 $scope.$on('$destroy') 事件。这是有道理的,因为当父作用域被销毁时,组件的包含作用域也会被销毁。但是,我仍然可以单击“Component FUNC”按钮并调用与其关联的函数。为什么会发生这种情况?

  2. 当我从组件本身调用 $destroy() 时,只有 $scope.$on('destroy') 事件被触发,而 $onDestroy 未触发。此外,我无法像在案例 1 中那样访问“组件功能”按钮。

有人可以解释一下这两种情况的区别吗?

这不是现实生活中的用例,而是我想了解的东西。

谢谢你。

kev*_*nhe 5

看看以下链接:

https : //github.com/angular/angular.js/issues/15073
https://github.com/angular/angular.js/issues/14376

总而言之,他们给出的解释如下:

有一种误解,认为 controller.$onDestroy() 等价于 $scope.$on('$destroy'),其中 $scope 是传递给控制器​​的作用域。这并非总是如此。

更具体地说, controller.$onDestroy() 在控制器“居住”的范围被销毁时被调用。当你有一个隔离范围指令时,传递给控制器​​的范围(作为 $scope)不是控制器所在的范围,它是为指令模板创建的子范围。因此,调用 $scope.$destroy() 不会破坏控制器所在的作用域(也不会调用 controller.$onDestroy())。

controller.$onDestroy() 等价于 $scope.$on('$destroy') 的唯一情况是当指令的作用域为 false 时。这意味着没有创建新的作用域,因此传递给控制器​​的作用域(作为 $scope)与控制器所在的作用域相同。

这解释了第二种情况,但我仍然不明白为什么即使在调用 $destroy() 之后仍可以调用与“Component FUNC”按钮关联的函数。

我希望这有帮助。