【问题标题】:Observable of array with filter using Angular 5 with RxJS使用带有 RxJS 的 Angular 5 过滤器观察数组
【发布时间】:2018-07-01 08:00:13
【问题描述】:

我正在创建一个简单的论坛。

我正在寻找过滤帖子。我在使用 RxJS 中的 .pipe 和 .filter 时遇到了一些问题。

我正在尝试:

  • api/posts 检索内存中api 帖子列表,当与http.get 一起使用时,它返回Observable<Post[]>
  • 遍历Observable<Post[]> 中的每个Post 并对其进行过滤,因此它只选择ID 为1 的每个帖子(仅存在一个ID 为1 的帖子)。
  • 将任何错误或函数是否成功记录到控制台

filter 不会选择 Post[] 数组中的每个单独的部分,而是选择 Post[] 本身。

我的代码:

getPosts(): Observable<Post[]> {

  // Sets the url to the service's postsUrl
  const url = this.postsUrl;

  // The http.get returns an Observable<Post[]>
  return this.http.get<Post[]>(url)
    .pipe(
      filter(
        post: Post => post.id == 1
      ),
      // Log posts were fetched
      tap(posts => console.log('Posts fetched.')),
      // Error handling
      catchError(this.handleError('getPosts', []))
    );
 }

我的错误:

Property 'id' does not exist on type 'Post[]'

在我看过的所有示例中,过滤器都没有这个问题。我认为它应该遍历 Post[], 数组中的所有值,因此我可以将它作为 Post 类型访问。


回答后编辑

根据接受的答案,我的最终代码如下所示:

posts.service.ts:

getPosts(): Observable<Post[]> {

  const url = this.postsUrl;

  // Return the observable with array of Posts
  return this.http.get<Post[]>(url)
    .pipe(
      // Log posts were fetched
      tap(posts => console.log('Posts fetched.')),
      // Error handling
      catchError(this.handleError('getPosts', []))
    );

}

posts.component.ts:

private getPosts(): void {
  this.service.getPosts()
    // Map posts to a filtered version
    .map(
      posts => posts.filter(
        post => post.from_board_id == this.from_board_id
      )
    )
    // Subscribe it
    .subscribe(
      posts => this.posts = posts
    )
  ;
}

【问题讨论】:

    标签: angular typescript rxjs angular5


    【解决方案1】:

    Observables 是值流。你对 RXJS 说你将收到Post[] 的流,换句话说,Array&lt;Post&gt;

    如果你想过滤数组,你可以这样做:

     return this.http.get<Post[]>(url).map(posts => posts.filter(post => post.id === 1))
    

    【讨论】:

    • 我上面的编辑显示了我的最终代码,使用的是你展示的内容,并对过滤器和代码布局进行了一些更改。谢谢!
    猜你喜欢
    • 2020-09-05
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 2018-11-23
    相关资源
    最近更新 更多