Angular 在服务中使用BehaviorSubject?
我的服务代码如下:Angular 在服务中使用BehaviorSubject?,angular,rxjs,behaviorsubject,Angular,Rxjs,Behaviorsubject,我的服务代码如下: private caseListSource = new BehaviorSubject({}); caseList$ = this.caseListSource.asObservable(); loadCaseList() { return this._httpClient.get<Case>(environment.api_url +'/cases').do(data =>{ this.caseListSource.next(dat
private caseListSource = new BehaviorSubject({});
caseList$ = this.caseListSource.asObservable();
loadCaseList() {
return this._httpClient.get<Case>(environment.api_url +'/cases').do(data =>{
this.caseListSource.next(data);
});
目前,我正在使用do
调用BehaviorSubject
的下一步。有更好的方法吗?我应该在m subscribe call中调用.next()
?我会在每个需要通知的组件中调用next
最初我没有使用
行为主题
,但当我登录到我的应用程序并转到选择
路径时,选择组件中的ngOnInit将填充案例列表,我也会在另一个组件中使用它。一旦我刷新了一个页面,例如case\2988
,案例列表将返回为未定义。如果您只想在应用程序启动时发出一个请求,则行为主题非常有用
如果是这种情况,那么您的组件应该订阅主题:
ngOnInit() {
this.subscription = this._caseService.caseList$
.subscribe(data => this.caseList = data);
}
如果你不关心提出几个请求,那么你就不应该使用它
(这是我的观点和做事方式,我可能是错的,所以不要把我的话当作绝对的和唯一的真理)你为什么要创造3个不同的观察点
private caseListSource=new BehaviorSubject({})代码>是可观察的
caseList$=this.caseListSource.asObservable()代码>是可观察的
返回此值。_httpClient.get(environment.api_url+'/cases')
是另一个可观察的值
只需在loadCaseList
中返回http调用,就可以观察到http调用响应。比如:
loadCaseList() {
return this._httpClient.get<Case>(environment.api_url +'/cases');
}
通过这种方式,您可以获得初始值,然后在调用loadCaseList
后切换到http调用。那么您正在使用BehaviorSubject
作为缓存?@martin-可能,我更新了我关于初始问题的帖子。也许您可以将流(This.\u httpClient.get…
)保存为公共属性(或通过函数公开)并放置shareReplay(1)
操作符。当有人第一次订阅时,它将调用它,并与所有未来的订阅者共享结果。我对使用BehiavorSubject而不是在服务中使用共享变量感到有点困惑。如果我使用共享变量创建服务,甚至覆盖它们,角度组件将所以检测这些变化,那么为什么我应该使用BehiavorSubject而不是共享变量?例如,数组。我真的这样做是因为我看到的每个使用BehaviorSubject的例子都是这样做的。我更新了我的帖子,解释了为什么我开始使用一个。我更新了我的答案,以显示开关映射
用法。caseListSource值在中没有更新您的示例,这违背了将其用作缓存的目的。我认为behavior Subject的要点是,每次发出请求时,订阅它的所有组件都会收到通知?主题也会收到通知,但我要解释的是,当您做您想做的事情时,如何将行为主题用作缓存。
loadCaseList() {
return this._httpClient.get<Case>(environment.api_url +'/cases');
}
loadCaseList() {
this.caseListSource = this._httpClient.get<Case>(environment.api_url +'/cases');
return this.caseListSource;
}
private caseListSource = new BehaviorSubject({}); // creates the behaviorSubject with an initial value
loadCaseList() {
return this.caseListSource.switchMap(() => {
return this._httpClient.get<Case>(environment.api_url +'/cases');
});
}