Angular2中的内存泄漏

时间:2016-08-18 06:53:24

标签: angular memory-leaks

什么会导致Angular2(rc5)应用程序中的内存泄漏?如何预防?

非常感谢错误/正确的代码示例。

2 个答案:

答案 0 :(得分:16)

在浏览器中,Angular只是JavaScript,所以典型的警告适用。

Angular特别警告的一件事是Observables。一旦您订阅了一个,即使您导航到另一个视图,它也会一直有效,直到您取消订阅为止。在可能的情况下,Angular会出现异常情况(例如,如果您在模板中使用async管道:

<强>模型

//listenToServer returns an observable that keeps emitting updates
serverMsgs = httpService.listenToServer();

<强>模板

<div>{{serverMsgs | async}}</div>

Angular会在div中显示服务器消息,但在您离开时会结束订阅。

但是,如果您自己订阅,则还必须取消订阅:

<强>模型

msgs$ = httpService.listenToServer().subscribe(
    msg => {this.serverMsgs.push(msg); console.log(msg)}
);

<强>模板

<div *ngFor="let msg of serverMsgs">{{msg}}</div>

当您离开时,即使您在视图中看不到新消息,您也会看到它们在到达时打印到控制台。要取消订阅组件的时间,您可以执行以下操作:

ngOnDestroy(){ this.msgs$.unsubscribe(); }

From the docs

  

我们必须在Angular破坏组件之前取消订阅。没有   这样做可能会造成内存泄漏。

答案 1 :(得分:0)

@BeetleJuice提及above的订阅和取消订阅方面肯定是我们需要牢记的第1项预防措施,以防止内存泄漏。

为了更好地理解一些内存管理技术,您可以查看Memory management in Angular applications。 (请注意,您可以在多个站点中找到完全相同的文章。版权问题在这里和那里?)

关于“事件听众”,我想说一件事。在我最近完成的一个项目中,我使用事件发射器和子组件的侦听器与父组件进行通信。我特别坚持一条规则:

  

父组件只侦听DIRECT子组件。

这里,父组件充当容器组件,子组件充当表示组件。

这样我可以确保每当我删除子组件时,只有一个点,即直接父组件,以删除其所有侦听器。到目前为止,这个规则对我来说非常有用。