J'ai le code suivant dans mon constructeur:
this.searchResults = this.searchTerm.valueChanges
.debounceTime(500)
.distinctUntilChanged()
.switchMap(term => this.apiService.search({
limit: this.searchResultsLimit,
term: term
}));
Et c'est mon entrée
<input type="text" [formControl]="searchTerm" />
Vous pouvez voir le tutoriel que j'ai suivi pour obtenir le code ici .
Ma méthode de service API est la suivante:
searchCompanies(options): Observable<any[]> {
return this.jsonp.get('api/search', this.formatOptions(options)).map(res => {
return res.json();
});
}
Chaque fois que searchTerm
est modifié dans mon entrée, l'appel d'API est déclenché. Mon problème est que l'appel est déclenché même lorsque mon entrée est vide (par exemple, taper une requête, puis revenir en arrière).
Ma question est, comment puis-je faire en sorte que mon observable ne se déclenche que lorsque la valeur de `searchTerm n'est pas vide/nulle?
Si vous souhaitez éviter l'appel de l'API et que les résultats de la recherche soient réinitialisés lorsque le terme de recherche est vide, testez une chaîne vide dans switchMap
et renvoyez un observable vide dans cette situation:
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([])
});
Le plus facilement, utilisez simplement l'opérateur filter()
pour filtrer tous les term
s vides:
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
}));