То, что вы пытаетесь сделать, это отфильтровать результаты. Стоит прочитать следующее: Нет FilterPipe или OrderByPipe , где Angular Team пропустила эти каналы и рекомендует:
Команда Angular и многие опытные разработчики Angular настоятельно рекомендуютперемещение логики фильтрации и сортировки в сам компонент. Компонент может предоставлять свойство filteredHeroes
или sortedHeroes
и контролировать, когда и как часто выполнять вспомогательную логику. Любые возможности, которые вы могли бы поместить в канал и совместно использовать в приложении, можно записать в службу фильтрации / сортировки и внедрить в компонент.
Поэтому я бы предложил перенести это в службу, есливам это нужно для многих компонентов, в противном случае вы можете справиться с этим в компоненте, как простой пример, который я вам привожу здесь:
При получении данных вы присваиваете значения массива двум массивам, одному оригинальному и одному дляфильтрация, например:
ngOnInit() {
this.myService.getData().subscribe((data: Todo[]) => {
this.todos = data;
// this we will display in template
this.filteredTodos = data;
});
}
И в строке поиска вы вызываете функцию, например с именем search
, которой вы передаете значение, введенное пользователем:
search(term) {
this.filteredTodos = this.todos.filter(todo => {
return todo.title.toLowerCase().includes(term.toLowerCase());
})
}
Затем в шаблоне вы можете просто проверить длину массива filteredTodos
и отобразить No results
, если длина равна 0
:
<input [ngModel]="term" (ngModelChange)="search($event)"/>
<ul *ngIf="filteredTodos.length; else noThings">
<li *ngFor="let todo of filteredTodos">
{{ todo.title }}
</li>
</ul>
<ng-template #noThings>
<div>
No Result
</div>
</ng-template>
STACKBLITZ образец для вышеуказанного кода.