2017-02-20 3 views
3

は、私は自分のコンストラクタの内部次のコードを持っている:用語が空/空でない場合にObservableを実行するにはどうすればいいですか?

this.searchResults = this.searchTerm.valueChanges 
    .debounceTime(500) 
    .distinctUntilChanged() 
    .switchMap(term => this.apiService.search({ 
     limit: this.searchResultsLimit, 
     term: term 
    })); 

をそして、これはあなたが、私はコードhereを得るために、その後のチュートリアルを見ることができます私の入力

<input type="text" [formControl]="searchTerm" /> 

です。以下のように

マイAPIサービスメソッドは次のとおりです。

searchCompanies(options): Observable<any[]> { 
    return this.jsonp.get('api/search', this.formatOptions(options)).map(res => { 
     return res.json(); 
    }); 
} 

たびsearchTermが私の入力内で変更され、APIコールが発射されます。私の問題は、私の入力が空であっても(例えば、クエリを入力してからすべてをバックスペーシングしても)コールが起動されることです。

私の質問は、 `searchTermの値が空でない/ヌルでないときに私の観測可能なものを得るにはどうすればいいですか?

+0

あなたはそれがSIMPLではないでしょう – Aravind

+0

コンストラクタであれば条件を持つことができますあなたのサービスをチェックするには? – developer033

+0

@ developer033 - 私のサービスはまっすぐ観測可能です。私は今方法で質問に編集を行います。 – Fizzix

答えて

4

を、switchMapに空の文字列のためのテストとその状況に空に観察を返す:

this.searchResults = this.searchTerm 
    .valueChanges 
    .debounceTime(500) 
    .distinctUntilChanged() 
    .switchMap(term => term ? 
    this.apiService.search({ 
     limit: this.searchResultsLimit, 
     term: term 
    }) : 
    // If search term is empty, return an empty array 
    // or whatever the API's response for no matches 
    // would be: 
    Observable.of([]) 
    }); 
+0

ニート。しかし、残念ながら 'term 'が空であれば' searchResults'は空になりません。 – Fizzix

+2

この場合、一致するものがなければ返されるAPIを返すべきです。たとえば、空の配列を返すには、Observable.empty()をObservable.of([])に置き換えます。 – cartant

+1

'Observable.of([])'が完璧に動作しました。ありがとうございます。 – Fizzix

2

ほとんど簡単だけですべての空のtermのフィルタリングするfilter()演算子を使用する:あなたはAPI呼び出しを避けたいと検索語が空の場合、検索結果をリセットしたい場合は

this.searchResults = this.searchTerm.valueChanges 
    .filter(term => term) // or even better with `filter(Boolean)` 
    .debounceTime(500) 
    .distinctUntilChanged() 
    .switchMap(term => this.apiService.search({ 
     limit: this.searchResultsLimit, 
     term: term 
    })); 
+0

シームレスに動作します。それにもかかわらず、 'this.searchResults'の問題は、' term'が空のときにAPIサービスから最後に返された結果の値になります。検索語が空の場合、 'this.searchResults'を' null'または 'undefined'に設定するにはどうすればいいですか? – Fizzix

+0

あなたの 'this.searchResults'はObservableを保持しているので、おそらくあなたはそれを上書きしたくありません。 – martin

+0

'filter'が私の日付を保存しました。 – KevinOrfas

関連する問題