【发布时间】:2018-07-07 08:34:39
【问题描述】:
有时我想订阅一个可观察对象,只是为了让一个发射触发其他事件。例如,订阅路由中的查询参数,以便从发出触发另一个事件 - 其中发出的值实际上并不重要。或者例如,如果我有一个 BehaviorSubject 并且需要根据对该主题的更改重新加载某些组件。在这些情况下,observable 并不意味着被模板使用,并且它们发出的值在很大程度上被忽略了。
理想情况下,我会写如下内容:
ngOnInit() {
this.service.behaviorSubject.subscribe(
() => callLocalMethod()
)
}
问题是,一旦组件被销毁,angular 不会取消订阅该订阅,这意味着每次初始化和销毁组件时,除了旧订阅之外,还会创建一个新订阅,并调用从 observable 发出的订阅每个冗余订阅。在 OnDestroy 生命周期钩子中取消订阅是不可能的(据我所知),因为订阅没有分配给一个属性——但是对于这个用例来说,将它分配给一个属性似乎是不必要的。
所以我最终要做的是为每个订阅创建一个属性,即使该属性永远不会被使用,将其分配给订阅,然后在组件被销毁时调用unsubscribe()。
这似乎真的多余 - 有更好的方法吗?使用异步管道处理订阅不是一种选择,而使用 EventEmitter 也不是一种选择,因为通常希望它表现得像一个热的 observable。
【问题讨论】:
-
不确定,试试类似:
subscribe(() => {}).unsubscribe()。看看有没有效果? -
在 subscribe() 之后立即调用 unsubscribe() 不起作用。
-
this.service.observable.unsubscribe() 在 ngOnDestroy 中不起作用吗?你试过吗?
-
好的,知道了。我想我不知道其他方法,除了分配。
-
@varunsingh 不行,不能退订observable的注入实例。
标签: angular rxjs rxjs5 reactive behaviorsubject