重置 ReplaySubject 值
Reset ReplaySubject value
我有这样的文件结构:
- facade.ts
- state.ts
- component.ts
在 facade
我有:
...
getArticles(): Observable<Article> {
return this.articleService.fetchAll();
}
...
在state
我有:
...
triggerArticlesFetch$ = new ReplaySubject<void>(1);
articles$ = this.triggerArticlesFetch$.pipe(
switchMap(() => this.fc.getArticles()),
shareReplay(1)
);
loadArticles(): void {
this.triggerArticlesFetch$.next();
}
getArticles(): Observable<ArticleShare[]> {
return this.articles$;
}
...
最后在 component
我有:
...
`
<span> {{ articles$ | async | json }} </span>
`
...
...
articles$: Observable<Article> = this.st.getArticles();
ngOnInit() {
this.st.loadArticles();
}
...
但是我对 'invalidating' 这个数据有一些问题(组件是可重用的 - 状态包含以前的数据)。
每次我调用 loadArticles()
时,clear/reset 到 []/null
articles$
(可能在状态文件中)的最佳方法是什么?
根据我的评论(据我了解)展开,每次初始化组件时,可观察对象都应以 []
(或 null
)开头。我能想到的最快解决方法是将 startWith
通过管道传输到源。
尝试以下方法
状态
...
triggerArticlesFetch$ = new ReplaySubject<void>(1);
articles$ = this.triggerArticlesFetch$.pipe(
switchMap(() =>
this.fc.getArticles().pipe(
startWith([]) // or `null` as per requirement
)
),
shareReplay(1)
);
我有这样的文件结构:
- facade.ts
- state.ts
- component.ts
在 facade
我有:
...
getArticles(): Observable<Article> {
return this.articleService.fetchAll();
}
...
在state
我有:
...
triggerArticlesFetch$ = new ReplaySubject<void>(1);
articles$ = this.triggerArticlesFetch$.pipe(
switchMap(() => this.fc.getArticles()),
shareReplay(1)
);
loadArticles(): void {
this.triggerArticlesFetch$.next();
}
getArticles(): Observable<ArticleShare[]> {
return this.articles$;
}
...
最后在 component
我有:
...
`
<span> {{ articles$ | async | json }} </span>
`
...
...
articles$: Observable<Article> = this.st.getArticles();
ngOnInit() {
this.st.loadArticles();
}
...
但是我对 'invalidating' 这个数据有一些问题(组件是可重用的 - 状态包含以前的数据)。
每次我调用 loadArticles()
时,clear/reset 到 []/null
articles$
(可能在状态文件中)的最佳方法是什么?
根据我的评论(据我了解)展开,每次初始化组件时,可观察对象都应以 []
(或 null
)开头。我能想到的最快解决方法是将 startWith
通过管道传输到源。
尝试以下方法
状态
...
triggerArticlesFetch$ = new ReplaySubject<void>(1);
articles$ = this.triggerArticlesFetch$.pipe(
switchMap(() =>
this.fc.getArticles().pipe(
startWith([]) // or `null` as per requirement
)
),
shareReplay(1)
);