gpt4 book ai didi

angular - 有没有办法在不分配的情况下取消订阅BehaviorSubject?

转载 作者:行者123 更新时间:2023-12-01 18:43:56 27 4
gpt4 key购买 nike

有时我想订阅一个可观察对象,只是为了让发射触发额外的事件。例如,订阅路由中的查询参数,以便从发出触发另一个事件 - 其中发出的值实际上并不重要。或者例如,如果我有一个BehaviorSubject,并且需要根据该主题的更改重新加载某些组件。在这些情况下,可观察量并不意味着由模板使用,并且它们发出的值在很大程度上被忽略。

理想情况下我会写这样的内容:

ngOnInit() {
this.service.behaviorSubject.subscribe(
() => callLocalMethod()
)
}

问题是,一旦组件被销毁,Angular 就不会取消订阅,这意味着每次组件初始化和销毁​​时,除了旧订阅之外,还会创建一个新订阅,并调用从可观察对象发出的订阅。每一个冗余的订阅。在 OnDestroy 生命周期 Hook 中取消订阅是不可能的(据我所知),因为订阅未分配给属性 - 但对于此用例来说,将其分配给属性似乎没有必要。

所以我最终要做的是为每个订阅创建一个属性,即使该属性永远不会被使用,将其分配给订阅,然后调用 unsubscribe()当组件被破坏时。

这看起来确实多余 - 有更好的方法吗?使用异步管道处理订阅不是一个选项,并且使用 EventEmitter 也不是一个选项,因为通常希望它表现得像热可观察对象。

最佳答案

您可以使用其他主题:

private destroy$ = new Subject();

constructor() {
obs$
// Ensures that we complete when the component is
// destroyed. Completing will automatically unsubscribe.
.takeUntil(this.destroy$)
.subscribe();
}

ngOnDestroy() {
this.destroy$.next();
this.destroy$.complete();
}

这样做的好处是它可以很好地扩展,因为无论您管理的订阅数量有多少,样板都只需要一次。

还要注意,ActivatedRouter 实际上是在组件销毁时完成 params/paramMap 的,因此参数更改不需要手动取消订阅。

关于angular - 有没有办法在不分配的情况下取消订阅BehaviorSubject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48487857/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com