【发布时间】:2019-01-28 13:35:47
【问题描述】:
我有一些关于 Angular 组件和 OnDestroy 生命周期钩子的小问题。
我有一个 Angular 服务和一个 Angular 组件。从组件中,我在服务中调用一个函数。因为函数不能直接返回结果,所以我使用回调来获取结果。我将回调作为组件内部的箭头函数传递。
我注意到,如果我执行调用服务内部函数的函数,然后 - 在调用回调之前 - 路由到另一个组件,因此当前组件被销毁,回调仍然在组件本身之后执行(其中包含作为箭头函数的回调)被销毁。
现在回答我的问题:
这在幕后是如何工作的? Angular 是否只销毁视图(模板)并等待回调被调用,然后销毁其余的(代码)?
还是说 ngOnDestroy 只销毁视图,其余的由垃圾收集/浏览器本身处理?
有什么方法可以检查组件是否仍然存在并且没有被销毁,然后才调用回调?
【问题讨论】:
-
出于好奇,为什么服务不能返回直接结果?它是返回一个承诺还是其他异步结果?也许在这种情况下,您可以在控制器中有一个 true false 标志,该标志在回调完成时更新,如果为 true 则允许导航
-
Angular 永远不会“破坏代码”。
ngOnDestroy是 Angular 销毁由该组件创建的 DOM 节点时调用的方法。函数调用仍在浏览器堆栈中,仍将被调用。 -
@Dale 对不起 :) 服务中的函数读取传递目录的条目并返回目录中的文件数组(我正在使用条目 API)。
-
@ritaj 感谢您澄清这一点。所以浏览器会在不再需要时收集其余的组件实例(代码等),或者这是如何工作的?
-
好吧,当没有更多对象引用时,浏览器会收集对象实例。当
onDestroy发生时,Angular 将取消引用组件实例。在组件销毁之前调用的函数仍然会在堆栈上,因此组件还不会被回收。
标签: javascript html angular typescript