Angular 过滤可观测阵列

Angular 过滤可观测阵列,angular,rxjs,Angular,Rxjs,我是rxjs操作符的新手,我试图简化我的代码。 当状态更改(currentstate)时,我想筛选具有此特定状态的项目列表,并限制为10项 这是我的代码: this.currentState$ .pipe( take(1), switchMap(state => { this.state = state; return this.projects$; }), take

我是rxjs操作符的新手,我试图简化我的代码。 当状态更改(currentstate)时,我想筛选具有此特定状态的项目列表,并限制为10项

这是我的代码:

    this.currentState$
      .pipe(
        take(1),
        switchMap(state => {
          this.state = state;
          return this.projects$;
        }),
        takeWhile(_ => this.alive),
        filter(projects => !!projects.length),
        map(projects => {
          console.log('------------------MAP------------');
          return projects.filter((project: Project, index: number) => project.state === this.state.id && index < this.count);
        }))
      .subscribe(projects => this.filteredProjects = projects);
this.currentState$
.烟斗(
以(1)为例,
开关映射(状态=>{
this.state=状态;
返回此.projects$;
}),
takeWhile(=>this.alive),
过滤器(projects=>!!projects.length),
地图(项目=>{
log('------------MAP-------');
返回projects.filter((project:project,index:number)=>project.state===this.state.id&&indexthis.filteredProjects=projects);
我试图简化并返回一个可观察的,但它看起来像是开关映射日志被调用了3次,我不明白为什么。这正常吗

代码如下:

    return this.currentState$
      .pipe(
        take(1),
        switchMap(state => {
          console.log('----SWITCHMAP-----');
          this.state = state;
          return this.projects$.pipe(
            filter(projects => !!projects.length),
            map(projects => projects.filter((project: Project, index: number) => project.state === this.state.id && index < this.count)));
        }));
返回此.currentState$
.烟斗(
以(1)为例,
开关映射(状态=>{
log('----SWITCHMAP-----');
this.state=状态;
返回此.projects$.pipe(
过滤器(projects=>!!projects.length),
映射(projects=>projects.filter((project:project,index:number)=>project.state==this.state.id&&index
其他问题:我想加载更多的项目,是否可以轻松地加载? 我想我首先需要按状态创建一个可观察的过滤器。如果状态改变,我会有新的列表。 每次点击后,我都会创建另一个可观察的对象,列表中的项目数量会有所限制吗

感谢您的帮助

这里是我的解决方案:

  private filterProjects() {
    return this.currentState$.pipe(
      switchMap(state => this.store.pipe(select(fromProject.getAllProjects),
        map(projects => projects.filter((project: Project) => project.state === state.id))
      )));
  }

  loadMore() {
    this.count += 10;
  }