2017-02-20 23 views
3

У меня есть следующий код внутри моего конструктора:Как выполнять только наблюдаемый, если не пустой или пустой?

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 не пустое/пустое?

+0

Вы можете иметь, если условие в конструкторе – Aravind

+0

не было бы Симпли y сделать чек на ваш сервис? – 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

Уход. Но, к сожалению, 'searchResults' не очищается, когда' term' пуст/null. – Fizzix

+2

Ну, в таком случае вы должны вернуть все, что API вернет, если совпадение не будет. Например, чтобы вернуть пустой массив, замените 'Observable.empty()' на 'Observable.of ([])'. – 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

Работы бесшовно. Хотя в этом случае проблема 'this.searchResults' является значением последних возвращенных результатов из службы API, когда' term' пуст. Как можно было установить «this.searchResults» в «null» или «undefined», если поисковый запрос пуст? – Fizzix

+0

Ваши 'this.searchResults' удерживают Observable, поэтому вы, вероятно, не хотите его переопределять. – martin

+0

'filter' сохранил мою дату. – KevinOrfas