行为主体仅发出路线更改的最后一个值

时间:2017-07-26 14:31:19

标签: angular typescript firebase rxjs angular2-routing

发布组件订阅行为主题并获得帖子订阅。第一次工作正常,但是当我转到另一个页面然后回来时我只得到帖子的最后一个值,但我需要像第一次一样的所有帖子列表。

发布服务:

  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;

      }

  })

}

2 个答案:

答案 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;  
}

然后,如果只需要一个元素,则必须更改消耗代码以在发出的数组中使用最后一个元素。

这将为您提供加载列表的最后一个快照。

相关问题