Код rxjs довольно хорош, использование debounceTime
и switchMap
такое же, как я бы использовал.
app.component
Основная проблема заключается в том, что вы реагируете на отдельные ключи, когда было бы лучше (и меньше кода) реагировать на событие input
.
Вы также можете обнаружить, что он лучше работает с пользовательскими действиями, не связанными с клавиатурой, такими как selectAll + cut
и сенсорными событиями.
шаблон
<input [(ngModel)]="nameModel"
(input)="onInput($event)"
placeholder="Enter Tag Name">
Обработчик
onInput(event) {
const searchTerm = event.target.value;
console.log('value', searchTerm);
this.results$ = this.searchService.search(searchTerm)
}
В методе обработчика я также изменил обработку результатов на наблюдаемое свойство, чтобы вам не приходилось подписываться, так как подписки необходимо отписать в ngOnDestroy
, чтобы избежать утечек памяти.
компонент
export class AppComponent {
//results: Object;
results$: Observable<string[]>
шаблон
<ul>
<li *ngFor="let result of ((results$ | async) | slice:0:9)"
Поиск-service.ts
Служба также может использовать некоторые настройки.
Если вы передадите ненаблюдаемую строку поиска, а затем закроете ее в Observable.of()
перед отменой, вы можете удалить код Subject
из компонента.
Компоненты должны быть максимально тупыми, чтобы упростить тестирование и упростить их модификацию для новых функций.
Я также деструктурировал объект результатов и просто вернул массив. Причина этого состояла в том, что пустой поисковый термин инициировал поиск, когда мы уже знаем, что результатом для пустого поискового термина должен быть пустой массив.
@Injectable()
export class SearchService {
baseUrl: string = 'https://api.cdnjs.com/libraries';
queryUrl: string = '?search=';
constructor(private http: Http) { }
search(term: string) {
return Observable.of(term)
.debounceTime(400)
.distinctUntilChanged()
.switchMap(term => this.searchEntries(term));
}
searchEntries(term) {
return term
? this.http
.get(this.baseUrl + this.queryUrl + term)
.map(res => res.json().results)
: Observable.of([]);
}
}
StackBlitz