行为主题(Rxjs)被自动调用
Behavior subjects (Rxjs) gets called automatically
我正在按照以下方式使用 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);
}
我有一个侧边栏组件,每次在下一个方法中都需要刷新,或者从各种组件发出任何新值。
侧边栏是公共组件,所有这些主题都在 ngOnInit 方法中订阅,这些主题是下一个(我的意思是从各种受尊重的组件发出值)
问题
每次这些主题都被自己调用,并且当没有相应的组件被实例化或不在生命周期中时,相关逻辑被调用。
无法找出它的原因也试图评论代码从它获得下一个仍然被自动调用的地方。
非常感谢任何帮助。
所有类型的 Subject
(包括 BehaviourSubject
)的要点是它们是热的,即即使没有订阅者它们也会发射。
如果您不想要这种行为,您应该考虑使用(冷)Observable
,或者使用没有初始值的 Subject
(或类似的)。
听起来像你不想要 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);
}
我正在按照以下方式使用 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);
}
我有一个侧边栏组件,每次在下一个方法中都需要刷新,或者从各种组件发出任何新值。
侧边栏是公共组件,所有这些主题都在 ngOnInit 方法中订阅,这些主题是下一个(我的意思是从各种受尊重的组件发出值)
问题
每次这些主题都被自己调用,并且当没有相应的组件被实例化或不在生命周期中时,相关逻辑被调用。
无法找出它的原因也试图评论代码从它获得下一个仍然被自动调用的地方。
非常感谢任何帮助。
所有类型的 Subject
(包括 BehaviourSubject
)的要点是它们是热的,即即使没有订阅者它们也会发射。
如果您不想要这种行为,您应该考虑使用(冷)Observable
,或者使用没有初始值的 Subject
(或类似的)。
听起来像你不想要 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);
}