我有一个Angular服务,该服务保留私有BehaviorSubject
,以便它可以在任何给定时间读取值。它是私有的,因此使用它的任何组件都无法对其进行操作。而是将常规Observable
公开。 BehaviorSubject
现在是此可观察对象发出的任何数据的使用者。
public subheaderData$: Observable<SubheaderData>;
private subheaderDataSubject$: BehaviorSubject<SubheaderData> = new BehaviorSubject<SubheaderData>(null);
constructor(private repository: SubHeaderRepository) {
this.subheaderData$ = this.load();
this.subheaderData$.subscribe(this.subheaderDataSubject$);
}
如您所见,我正在通过服务呼叫.subscribe
,这使我的可观察性立即变热。我要实现的是,注入此服务的组件必须订阅公共Observable
,并且在发生这种情况时,BehaviorSubject
应该自动添加为观察者,即使该组件没有关于它的知识(由于它是私有的。
这怎么实现?
答案 0 :(得分:1)
在您的服务构造函数中执行此操作
this.subheaderData$ = this.subheaderDataSubject$.asObservable();
然后在需要时订阅subheaderData$
您可以this.subheaderDataSubject$.next(someValue)
使用服务
答案 1 :(得分:1)
如果我没有遗漏任何重要信息,我认为即使使用这是一个不寻常的用例,您也只能使用multicast
来完成您想要的事情。
subheaderDataPublic$ = this.subheaderData$.pipe(
multicast(this.subheaderDataSubject$, s => s),
);
然后您将在组件中订阅subheaderDataPublic$
。
通常,您将使用multicast
这样的示例:
multicast(new Subject(), s => merge(s, s.pipe(...)))
...但是如果您通过this.subheaderDataSubject$
,它将用作中间主题。上面的s => s
是必需的,因为没有任何选择器函数multicast
会返回ConnectableObservable
的实例,这可能是您不需要的。
编辑:也许更容易理解的解决方案是只使用Observable
构造函数。
subheaderDataPublic$ = new Observable(observer => {
const subscriptions = new Subscription();
subscriptions.add(this.subheaderData$.subscribe(this.subheaderDataSubject$));
subscriptions.add(this.subheaderDataSubject$.subscribe(observer));
return () => subscriptions.unsubscribe();
});