RxJs Streams - 生成单个主流的多个流

问题描述 投票:0回答:1

我有一个对象数组的主列表,然后是由数组表示的另外两个选择列表。我将这些作为3个流$。

master$
filter1$
filter2$

在UI上,master $ is使用angular中的异步管道绑定到数据表。 filter1 $和filter2 $作为过滤器选项绑定到UI下拉列表。

在任何时候,filter1 $和filter $都可以根据用户选择的内容而改变。我觉得必须有一种方法将3个流组合在一起并根据需要应用这两个过滤器。我怎么能在RxJs中这样做?你能告诉我一个例子吗?我可以使用combineLatest,pipe和map来实现简单易读的代码吗?

更新:

以下是我目前的解决方案,非常确定有更好的方法来构建它:

combineLatest(
  master$.shareReplay(1),
  filter1$.shareReplay(1),
  filter2$.shareReplay(1)
)
  .map(([master, filter1, filter2]) => {
    let filtered = master;
    if (filter1.length > 0) {
      filtered = [];
      filtered = master.filter(each => filter2.indexOf(each.organizationId) !== -1);
    }
    if (filter1.length > 0) {
      master = filtered;
      filtered = [];
      filtered = master.filter(each => filter2.indexOf(each.organizationId) !== -1);
    }
    return filtered;
  })
  .subscribe(final => {
    this.list = final;
  });

}

typescript angular5 rxjs5
1个回答
0
投票

您可以通过一些抽象来简化:

/* my.component.ts */

@Component(/* ... */)
export class MyComponent {
    /* ... */
    public mySub: Subscription = Observable.combineLatest(master$, filter1$, filter2$)
        .map((valueLists) => valueLists.filter((val) => val && val.length > 0))
        .map((valueLists) => ArrayUtils.intersection(...valueLists))
        .subscribe(final => this.list = final);
}


/* array.utils.ts */

export class ArrayUtils {
    public static intersection(...arrays: any[]): any[] {
        const result = [];
        /* Intersection logic... */
        return result;
    }
}

交叉逻辑也可以从另一个源获取,例如lodash库。

© www.soinside.com 2019 - 2024. All rights reserved.