2017-02-20 45 views
3

我有我的構造函數中以下代碼:如何只執行一個Observable如果term不爲null/empty?

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

這是我輸入

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

你可以看到我跟着獲取代碼here教程。

我的API服務方法如下:

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

每次searchTerm是我裏面輸入改變,API調用被激發。我的問題是,即使當我的輸入爲空時(例如輸入查詢,然後退回全部),調用也會被觸發。

我的問題是,當`searchTerm的值不爲空/空值時,我怎麼才能讓我的observable被觸發?

+0

您可以在構造函數中有一個,如果條件 – Aravind

+0

豈不是SIMPL Ÿ檢查你的服務? – developer033

+0

@ developer033 - 我的服務是直觀的。我現在用這個方法編輯問題。 – Fizzix

回答

4

如果你想避免API調用,並希望搜索結果被重置時,搜索詞爲空測試在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.of([])'替換'Observable.empty()'。 – cartant

+1

'Observable.of([])'完美地工作,謝謝。 – Fizzix

2

最容易被剛剛使用filter()運營商過濾掉所有空term S:

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

無縫工作。然而,當'term'爲空時,它將'this.searchResults'的問題留作API服務最後返回結果的值。如果搜索詞爲空,那麼如何將this.searchResults設置爲null或undefined? – Fizzix

+0

你的'this.searchResults'持有Observable,所以你可能不想重寫它。 – martin

+0

'filter'保存了我的日期。 – KevinOrfas

相關問題