Angular2处理非组件类中的订阅

时间:2016-11-23 01:38:34

标签: angular rxjs observable angular2-observables

我对Angular2中的订阅处理有一个高级别的问题。我最近读过很多关于由于没有正确取消订阅而导致订阅处理不当导致代码内存泄漏的问题。

@Components的一个简单解决方案是在ngOnDestroy生命周期事件中满足所有订阅并处理它们。

但是,对于不属于@Component且确实有订阅的控制器,正确取消订阅的最佳方法是什么?目前,我正在考虑让控制器公开订阅或它自己的onDestroy方法,但这并不像是可以轻松/通用地完成所以我很想听到其他选项/意见。

谢谢!

编辑:澄清这不是服务问题,而只是控制器问题。

1 个答案:

答案 0 :(得分:1)

尽量避免手动订阅

  1. 当你在角度上下文之外时,不要在角度绑定流上使用订阅,这只会导致你处理混乱的情况。
  2. 尽量避免手动订阅。特别是在组件中! 90%的案例都不需要手动订阅。
  3. 为什么呢?那我该怎么做呢?

    在大多数情况下,您的应用程序只需要流动数据以获取当前显示在屏幕上的信息 - >让模板使用import * as foo from 'bar' - pipe来处理订阅 - 任何控制器都不需要手动订阅,这可以通过在没有任何手动订阅的情况下连接和扩展多个rxjs流来实现。

    您仍然可以在angular-contexts之外使用执行某些数据计算和其他逻辑的实用程序类,但是将这些方法嵌入到流中或让它们扩展现有流,但不要在那里进行任何手动订阅。

    无论显示何种数据,都必须执行永久计算?

    如果这种情况确实存在,那是有争议的,但我们可以这样说:这是服务的典型案例 - >在服务中订阅是可以的,因为服务是单例,因此不存在内存泄漏的巨大风险。