Angular 1.5组件$ onDestroy& $范围。$摧毁()

时间:2017-01-22 08:11:46

标签: javascript angularjs scope angular-components

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

定义说当需要销毁组件的包含范围时调用$ onDestroy。但与$ scope相同的情况是不是。$ destroy()?

根据我在https://plnkr.co/edit/9RlS8OLxAoyK80WPMJaN?p=preview

创建的编辑
<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>

我注意到两种情况。

  1. 当我从Parent或Child控制器调用$ destroy()时,在组件中触发$ onDestroy和$ scope。$ on(&#39; $ destroy&#39;)事件。这是有道理的,因为销毁父作用域时会破坏组件的包含范围。但是,我仍然可以点击“组件功能”和“组件功能”。按钮并调用与其关联的功能。为什么会这样?

  2. 当我从Component本身调用$ destroy()时,只会触发$ scope。$ on(&#39; destroy&#39;)事件,并且会触发$ onDestroy未触发。此外,我无法访问“组件功能”。我在案例#1中可以做的按钮。

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

    这不是一个真实的用例,而是我想要理解的东西。

    谢谢。

1 个答案:

答案 0 :(得分:1)

请看以下链接:

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

总结一下,他们给出的解释如下:

  

有一种误解,即控制器。$ onDestroy()相当于$ scope。$ on('$ destroy'),其中$ scope是传递给控制器​​的范围。情况并非总是如此。

     

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

     

唯一的情况,其中controller。$ onDestroy()等价于$ scope。$ on('$ destroy')是指具有scope:false的指令。这意味着不会创建新范围,因此传递给控制器​​的范围(作为$ scope)与控制器所在的范围相同。   

这解释了第二种情况,但是我仍然不明白为什么即使在你调用$ destroy()之后你也可以调用与'Component FUNC'按钮相关的功能。

我希望这会有所帮助。