Angular: 基于可观察的多重过滤

Angular: observable-based multi filtering

我有以下输入:

<form *ngIf="tests.length">
    <md-form-field class="whitePlaceholder" floatPlaceholder="never">
      <input mdInput placeholder="Find Tests..." [formControl]="testCtrl"
      class="whitePlaceholder">
    </md-form-field>
  </form>

输入负责在列表中按名称过滤测试:

<md-list-item *ngFor="let test of filteredTests | async">
</md-list-item>

我 运行 从我的 API 完成加载测试后的以下代码:

this.filteredTests = this.testCtrl.valueChanges
        .startWith(null)
        .debounceTime(250)
        .map(name => name ? this.filterTests(name) : tests.slice());

效果很好,但现在我添加了另一个过滤器:用户可以 select 从单选按钮中选择一个选项。这是负责按选中按钮过滤的方法:

updateList($event) {
    if ($event.value === 'all') {
      this.filteredTests = Observable.of(this.tests);
    } else {
      this.filteredTests = this.filteredTests
        .map((test) => test ? this.filterTestsStatus($event.value) : this.filteredTests.slice());
    }
  }

问题: 当用户单击单选按钮以按其中一个选项进行筛选时,filteredTests 变量被覆盖并且上面提到的测试名称搜索输入停止正在工作。

问题:如何让我的应用程序使用我的名字过滤器和我的单选选项过滤器而不是覆盖我的filteredTests

这些行真的正确吗?

this.filteredTests = this.filteredTests
    .map((test) => test ? this.filterTestsStatus($event.value) : this.filteredTests.slice());

不知道你为什么不在这里使用 TypeScript,因为它会有很大帮助,但我认为这里的类型不匹配。

所以说 this.filteredTests 是类型 Observable<TestType>。然后 map 接受一个从 TestTypeTestType 的函数,但是你传递的是 TestTypeObservable<TestType> 因为 this.filteredTests.slice() 显然是一个 Observable.

我不完全确定您要做什么,因为您似乎在将 tests 映射到 testsObservables。您希望 slice() 在这里做什么?