我有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)和A上的B(A-> B)。我只希望B依赖于A,以便A负责提供信息,而B则监听它们。
答案 0 :(得分:0)
从您的伪代码中,您似乎已经在从服务B中的服务A订阅了BehaviorSubject。如果要发出新值,则需要调用.next
someBehaviorSubject.next(someValue)
另外,您可能需要考虑通过asObservable
方法将Subject作为可观察对象公开。在执行操作时直接公开主题可能会很危险,因为它允许消费者直接访问主题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 => {
...
});
}
}