什么会导致Angular2(rc5)应用程序中的内存泄漏?如何预防?
非常感谢错误/正确的代码示例。
答案 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(); }
我们必须在Angular破坏组件之前取消订阅。没有 这样做可能会造成内存泄漏。
答案 1 :(得分:0)
@BeetleJuice提及above的订阅和取消订阅方面肯定是我们需要牢记的第1项预防措施,以防止内存泄漏。
为了更好地理解一些内存管理技术,您可以查看Memory management in Angular applications。 (请注意,您可以在多个站点中找到完全相同的文章。版权问题在这里和那里?)
关于“事件听众”,我想说一件事。在我最近完成的一个项目中,我使用事件发射器和子组件的侦听器与父组件进行通信。我特别坚持一条规则:
父组件只侦听DIRECT子组件。
这里,父组件充当容器组件,子组件充当表示组件。
这样我可以确保每当我删除子组件时,只有一个点,即直接父组件,以删除其所有侦听器。到目前为止,这个规则对我来说非常有用。