angular - 如何从服务中的另一个服务订阅 BehaviorSubject?
问题描述
我有 2 项服务:A 和 B 我在 A 中创建了一个 BehaviorSubject 并想在 B 中订阅它。
export class ServiceA{
someAttribute: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);
otherAttribute: BehaviorSubject<boolean>;
constructor(){
otherAttribute = new BehaviorSubject<boolean>(false);
}
}
...
export class ServiceB{
constructor(){
someAttribute.subscribe(newValue =>{...});
otherAttribute.subscribe(newValue =>{...});
}
}
问题:
服务 B 只运行一次订阅。意思是构造函数完成后,订阅也完成了。
问题:
如何从服务中的另一个服务订阅 BehaviorSubject?
其他信息 我正在使用 Angular CLI,对 BehaviorSubjects 有点陌生。我想拆分 2 个服务的职责,但其中一个依赖于另一个,并且必须监听某些属性的变化。
我也无法进行循环依赖,这意味着服务依赖于 B (B->A) 和 B 依赖于 A (A->B)。我只希望 B 依赖于 A,以便 A 负责提供信息,B 听取他们的意见。
解决方案
从您的伪代码看来,您已经从服务 B 中的服务 A 订阅了 BehaviorSubject。如果要发出新值,则需要调用.next
someBehaviorSubject.next(someValue)
此外,您可能需要考虑通过该asObservable
方法将 Subject 公开为 Observable。直接公开一个主题是有潜在危险的,因为它允许消费者直接访问主题 API - 即他们可以调用.next
和发出值。在您的情况下,这意味着服务 B 可以触发服务 A 发出。这可能是你想要的——在这种情况下没关系——但如果不是这样,不给消费者这个选项会更安全。就像是:
export class ServiceA{
constructor() {
this.foo = this._foo.asObservable();
}
private readonly _foo = new BehaviorSubject<boolean>(false);
public readonly foo: Observable<boolean>;
}
...
export class ServiceB{
constructor(private readonly _serviceA: ServiceA){
this._serviceA.foo.subscribe(value => {
...
});
}
}
推荐阅读
- phpunit - SilverStripe 4:FunctionalTest “get” 方法返回 404 状态,尽管页面在那里。
- javascript - 将我的脚本移动到外部页面,它们不再响应
- javascript - Textarea.value 不操纵 HTML
- ansible - 使用 ansible 将文件从远程主机复制到 vagrant 实例
- hadoop - hadoop reducer 的实现是否依赖于一个大的哈希映射来删除所有相同的键?
- c# - unity - 键绑定打开和关闭动画
- swift - 单击按钮时需要删除内部阴影
- linux - 从蓝牙读取数据 - Android、Raspberry Pi Zero、蓝牙
- swift - 放松不起作用,我有正确的代码
- angular - Angular Universal SSR TransferState 只有第一页数据可用