2017-09-06 18 views
0

I以下の入力を持っている:角度:観察可能なベースのマルチフィルタリング

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

は、私は、次のコードを実行するとI

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

それは素晴らしい作品が、今、私は別のフィルタを追加しました:私のAPIからテストをロードし終えるたちラジオボタンからオプションを選択できます。これはチェックし、ボタンによるフィルタリングの責任方法です:

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を上書きするのではなく、自分の名前フィルタとラジオオプションフィルタでアプリケーションを動作させる方法を教えてください。

答えて

0

これらの行は実際には正しいですか?それは大いに役立つだろうとして、あなたは、ここに活字体を使用していない理由を

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

はIDKが、私はタイプがここで一致しないと思います。

this.filteredTestsのタイプはObservable<TestType>です。次にマップはTestTypeからTestTypeに機能しますが、あなたが渡すのはTestTypeからObservable<TestType>で、this.filteredTests.slice()は明らかにObservableです。

testsからObservablestestsのように写像されているように、あなたがしようとしていることは完全にはわかりません。 slice()ここに何を期待していますか?