发布组件订阅行为主题并获得帖子订阅。第一次工作正常,但是当我转到另一个页面然后回来时我只得到帖子的最后一个值,但我需要像第一次一样的所有帖子列表。
发布服务:
public getPosts(): BehaviorSubject<Post> {
let postSubject: BehaviorSubject<Post> = new BehaviorSubject<Post>(Post.EMPTY_POST);
this.db.list(this.getModelPath()).subscribe((posts: Post[]) => {
posts.forEach((result) => {
let post: Post = Post.fromObject(result);
postSubject.next(post);
// code ommited
});
return postSubject;
}
订阅组件:(帖子列表组件)
public getPosts() {
this.showLoadingSpinner = true;
this._postService.getPosts().subscribe((post: Post) => {
if(Post.EMPTY_POST != post) {
this.showLoadingSpinner = false;
this.posts.push(post);
}
this.hasPostError = false;
}, (error) => {
this.loggerService.error(error);
this.showLoadingSpinner = false;
this.loggerService.log("error occured while getting posts.")
this.postErrorMessage = "error occured while getting posts.";
this.hasPostError = true;
}, () => {
this.showLoadingSpinner = false;
if (!this.posts.length) {
this.postErrorMessage = "No posts to show!";
this.hasPostError = true;
}
})
}
答案 0 :(得分:0)
BehaviorSubject
存储最新的发布值
尝试使用ReplaySubject
答案 1 :(得分:0)
看起来你应该next
- 整个数组而不只是一个元素。
public getPosts(): BehaviorSubject<Post> {
let postSubject: BehaviorSubject<Post> = new BehaviorSubject<Post>(Post.EMPTY_POST);
this.db.list(this.getModelPath()).subscribe((posts: Post[]) => {
this.postSubject.next(posts.map(post => Post.fromObject(post));
return postSubject;
}
然后,如果只需要一个元素,则必须更改消耗代码以在发出的数组中使用最后一个元素。
这将为您提供加载列表的最后一个快照。