行为主题(Rxjs)被自动调用

问题描述 投票:0回答:3

我正在按照以下方式使用 RxJs 行为主题。

=> 为所有行为主体提供公共服务,如下面的示例代码

@Injectable()
export class ProjectJobSelectionService {

public postTypeSubject = new BehaviorSubject(PostType.Project);
public selectedProjectSubject = new BehaviorSubject(null);
public selectedJobsiteSubject = new BehaviorSubject(null);
public selectedJobSubject = new BehaviorSubject(null);
public addJobsiteSubject = new BehaviorSubject(null);

}

我有一个侧边栏组件,每次在下一个方法中都需要刷新,否则任何新值都会从各种组件中发出。

side bar 是公共组件,所有这些主题都在 ngOnInit 方法中订阅,这些主题是下一个(我的意思是从各种受人尊敬的组件发出值)

问题

每次这些主题都被自己调用,并且当没有相应的组件被实例化或不在生命周期中时,尊重的逻辑被调用。

无法追回它的原因也试图评论代码从它获得下一个仍然被自动调用的地方。

任何帮助将不胜感激。

angular rxjs rxjs-observables
3个回答
2
投票

听起来像你做的not想要BehaviourSubject提供的默认值。

您可以尝试两种解决方案:

1) 过滤空值

无论你在哪里订阅一个 BehaviorSubject,你都可以像这样忽略空值:

selectedJobsiteSubject.pipe(
  filter(v => v != null)
).subscribe(
  /* ... */
);

2) 无默认值

没有默认值的 BehaviourSubject 只是一个 ReplaySubject,它在订阅时重放最近的发射。

所以你可以改变你的服务看起来像这样:

@Injectable()
export class ProjectJobSelectionService {

  public postTypeSubject = new BehaviorSubject(PostType.Project);
  public selectedProjectSubject = new ReplaySubject(1);
  public selectedJobsiteSubject = new ReplaySubject(1);
  public selectedJobSubject = new ReplaySubject(1);
  public addJobsiteSubject = new ReplaySubject(1);

}

2
投票

所有类型的

Subject
s(包括
BehaviourSubject
)的要点是它们是热的,即即使没有订阅者它们也会发射。 如果你不想要这种行为,你应该考虑使用(冷)
Observable
,或者使用没有初始值的
Subject
(或类似的)。


0
投票

我确定它打破了 RXJS 的正统观念,但我对这个问题的首选解决方案(这样我就不必重新配置所有东西来使用 Observables)是创建一种融合了两个世界优点的新型主题。这个主题就像一个 ReplaySubject,但有一个

value
字段,就像一个
BehaviorSubject
。它可以在没有初始值的情况下进行初始化(对我来说是 BehaviorSubjects 的一个烦人的方面),并且可以使用类
.pipe
方法(在我的至少代码)。希望对您有所帮助!
from()

© www.soinside.com 2019 - 2024. All rights reserved.