2017-12-12 8 views
0

タイプstring配列で観測可能なものを検索/フィルタリングするにはどうすればよいですか?例えばObservable onKeyUpをどのようにフィルタリングできますか?

、私は今、私は、入力テキストボックスにどのようなユーザーのタイプに基づいて、この観測可能にフィルタを適用したいと思い、観察

names$ = Observable.of(['Lenovo','Dell','Toshiba','Apple','Microsoft']); 

を次のようしています。

私は次のコードを持っています&入力ボックスに入力されたユーザーのsearchTermに基づいてフィルタリングされたobservableを返したいと思います。

私はクライアント側の解決策を探しています。何らかの理由でクライアント側のデータがすでに&にあります。データをフィルタするためにサーバー上に検索語を送信できません。また、この例では、配列自体にフィルターを直接使用できることを理解していますが、これを観測可能にしたいと思います。

また、フラットマップ演算子を使って配列を平坦化しようとしましたが、終わりにobservableを返すことができませんでした。これは文字列配列でなければなりません。

ご協力いただきますようお願い申し上げます。前もって感謝します。

App.component.html

<!-- Textbox to receive user input --> 
Search:<input type='text' [(ngModel)]='searchTerm' (keypress)='onkeypress($event.target.value)'> 
<p>Search Term: {{searchTerm}}</p> 
<hr> 

<!-- Show search results here as ordered list --> 
<ng-container *ngIf='(names$|async)?.length>0'> 
    <ol> 
     <li *ngFor='let name of names$|async'> 
      {{name}} 
     </li> 
    </ol> 
</ng-container> 

App.component.ts

import {Component, OnInit} from '@angular/core'; 
import {Observable} from 'rxjs'; 

@Component({ 
    selector: 'my-app', 
    templateUrl: './app.component.html', 
    styleUrls: ['./app.component.css'] 
}) 
export class AppComponent implements OnInit { 
    names$: Observable<string[]>; 
    filteredNames$: Observable<string[]>; 
    searchTerm: string; 

    ngOnInit() { 
     this.names$ = Observable.of(['Lenovo', 'Dell', 'Toshiba', 'Apple', 'Microsoft']); 
    } 

    // HOW TO IMPLEMENT THIS FUNCTION ?? 
    onkeypress(value) { 
     console.log(value); 
     this.names$ = this.names$.map(names => names.indexOf(value) > 0) 
     // .filter(x=>{console.log(x.indexOf(value));return x.indexOf(value)>0}) 
     //  .subscribe(
     // (data)=>console.log(data),  (error)=>console.log('Error'+error), 
     //  ()=>console.log('complete')); 
    } 
} 
+0

これは小さなことですが、キー押しイベントをリッスンして、関数keyupを呼び出しています。あなたがここで欲しい振る舞いをしているかどうかは分かりません。 –

+0

@Brendan Whiting間違いを指摘してくれてありがとう。それを私が直した。 – hp8888

答えて

1

これを試してみてください。

  1. なぜ観測値をnames.indexOf(value) > 0にマッピングしますか? .map()は文字通りオブザーバブルを変換し、タイプstringのオブザーバブルをキャストしてbooleanと入力しただけです。

  2. ユーザーが(onkeyupの)キー入力された場合namesのリストを変更したい場合は、なぜあなたは再びthis.names$this.names$バックを再割り当てしたいですか?それはあなたのコードを一度、最初のキーストロークだけで作業するようにします。値を保持する変数と、ngModelにバインドする変数の2つの変数が必要です。

  3. asyncパイプを使用したい場合は、あなたのtypescriptファイルのオブザーバブルを購読する必要はありません。あなたのonKeyUp機能

    ngOnInit() { 
        this.data$ = Observable.of(['Lenovo', 'Dell', 'Toshiba', 'Apple', 'Microsoft']); 
        this.names$ = this.data$; 
    } 
    

    あなたがasyncパイプを使用していると仮定すると、これはする必要があります:

    をごngOnInit()

、あなたの名前を追跡するために変数を作成

onKeyUp(value) { 
    this.names$ = this.data$ 
     .map(x => { 
      return x.filter(y=>y.toLowerCase().indexOf(value.toLowerCase())>-1); 
     }) 
} 

Working Stackblit s:https://stackblitz.com/edit/angular-yeaer6

+0

ご協力ありがとうございます。私があなたが言及したすべてのコメントを理解し、コードを更新し、キー押しイベントを修正しました。ここでは、あなたがここで言及したことを正確に行うstackblitzリンクがあります。//stackblitz.com/edit/angular-wtarysしかし、私はテキストを変更するときにフィルタリングされたリストが更新されることを期待していますが、それをやっていません。どんな考え? – hp8888

+0

@ hp8888私の悪い。コードを更新し、スタックブリッツを掲示しました。 – CozyAzure

+0

,,,,残念ながら、それはまだ動作していないか、私が望むふるまいではありません。私はhttps://stackblitz.com/edit/angular-yea6に行きました。これは動作するコードを持つべきです。しかし、テキストボックスに「Del」と入力すると、フィルタリングされたリストにデルが表示されます。申し訳ありませんが、私はこれを指摘しなければなりません。同様に、「Len」と入力すると、フィルタリングされたリストにLenovoが表示されます。このリンクを送信する前に、変更を保存するのを忘れた可能性がありますか? – hp8888

1

ここでのいくつかのミスがあります

let value='Del' 
Rx.Observable.from(['Lenovo','Dell','Toshiba','Apple','Microsoft']) 
.filter(name=>name.indexOf(value)!==-1) 
.subscribe(console.log); 
+0

こんにちはファン張、私の質問にお答えしていただきありがとうございます。私はあなたがここにあるコードを試したが、それは完璧に動作します。しかし、私は1つの質問があります。 Observable.fromをObservable.ofに変更する瞬間、それは動作を停止しました。なぜなら、次のような理由がないのです(私は、代わりにメソッドを呼び出したことに気が付いています)?let value = "Del" ' ' Rx.Observable.of(["Lenovo"、 "Dell"、 "Toshiba" Appleは、 "Microsoft"]) ' ' .filter(name => name.indexOf(value)!== - 1) ' ' .subscribe(console.log); ' – hp8888

+0

.ofあなたにすべてのリストを送ります(アレイ).subscribe(console.log)と(array).subscribe(console.log)を試してみてください。 –

関連する問題