组件什么时候被销毁?

36

在使用 Angular 2 进行 Ahead-of-Time (AOT) 编译时,我有一个父组件和一个子组件,如下所示:

<div>
    <h1>I am a parent</h1>
    <myChild *ngIf="showChild"></myChild>
</div>

我知道子模板是动态插入到DOM中的。

如果showChild被评估为false,那么Angular何时销毁子组件呢?或者Angular根本不会销毁子组件吗?这是否是Angular调用onDestroy()方法的时间?

1个回答

31

当Angular运行变更检测并更新NgIf指令的ngIf输入绑定时,NgIf会从DOM中移除组件。在组件从DOM中移除后,ngDestroy()被调用,然后组件就可以被垃圾回收了。

如果父组件在*ngIf表达式为真时被移除,则父组件和子组件将一起被销毁。不过我不知道ngDestroy()会先被调用还是后被调用。


如果子组件被销毁,Angular如何处理内存占用?假设我在onDestroy()中取消订阅和分离事件,垃圾回收会有多干净? - gye
Angular与垃圾回收无关。如果没有引用指向您的组件,那么JS虚拟机将会回收所有相关的类。Angular确保在组件被销毁后不再持有任何对该组件的引用。 - Günter Zöchbauer
@GünterZöchbauer ngOndestroy是否保证被调用? - Royi Namir
@RoyiNamir 当 Angular 移除组件或服务时,是的,如果您只是关闭选项卡,则 Angular 不会进行任何清理并且不会被调用。请参见 https://dev59.com/tVoU5IYBdhLWcg3wQ1Z3#37642657 如何在选项卡关闭时执行一些自定义清理。 - Günter Zöchbauer
@GünterZöchbauer ngOnDestroy方法什么时候被调用? 我的使用情况是我订阅了一个流并在ngOnDestroy上取消订阅,但即使我导航到另一个路由,它也没有停止,那么导航到另一个页面不会调用ngOnDestroy方法,那么如何在导航到另一页后立即停止订阅? - Dojo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接