我试图了解控制器的 $ 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>
我注意到两种情况。
当我从Parent或Child控制器调用$ destroy()时,在组件中触发$ onDestroy和$ scope。$ on(&#39; $ destroy&#39;)事件。这是有道理的,因为销毁父作用域时会破坏组件的包含范围。但是,我仍然可以点击“组件功能”和“组件功能”。按钮并调用与其关联的功能。为什么会这样?
当我从Component本身调用$ destroy()时,只会触发$ scope。$ on(&#39; destroy&#39;)事件,并且会触发$ onDestroy未触发。此外,我无法访问“组件功能”。我在案例#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'按钮相关的功能。
我希望这会有所帮助。