2017-07-26 24 views
0

訂閱了行爲主題的帖子組件並獲得帖子訂閱。第一次工作很好,但是當我轉到另一個頁面並返回時,我只能獲得帖子的最後一個值,但我需要第一次發佈所有帖子。行爲主題只發布路由更改中的最後一個值

崗位服務:

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

BehaviorSubject店最新發出的價值

嘗試使用ReplaySubject

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

然後你必須改變消費代碼,使用的最後一個元素所發出的數組中時,它發出,如果你只想要一個單一的元素。

這會給你加載列表的最後一個快照。

相關問題