在Angular中过滤列表通常涉及以下几个基础概念:
DatePipe
、UpperCasePipe
等可以直接使用。Angular提供了filter
管道,但需要注意的是,filter
管道在Angular 9及以后的版本中已被移除。可以使用*ngIf
结合方法来实现类似功能。
<!-- 在组件中定义一个过滤方法 -->
<div *ngFor="let item of items | filter:searchText">
{{ item.name }}
</div>
创建一个自定义管道来实现过滤功能。
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'filter'
})
export class FilterPipe implements PipeTransform {
transform(items: any[], searchText: string): any[] {
if (!items) return [];
if (!searchText) return items;
searchText = searchText.toLowerCase();
return items.filter(item => {
return item.name.toLowerCase().includes(searchText);
});
}
}
然后在模块中声明这个管道:
import { NgModule } from '@angular/core';
import { FilterPipe } from './filter.pipe';
@NgModule({
declarations: [FilterPipe],
exports: [FilterPipe]
})
export class PipesModule {}
在组件模板中使用这个管道:
<div *ngFor="let item of items | filter:searchText">
{{ item.name }}
</div>
在服务中定义过滤逻辑,然后在组件中调用这个方法。
// filter.service.ts
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class FilterService {
filterItems(items: any[], searchText: string): any[] {
if (!items) return [];
if (!searchText) return items;
searchText = searchText.toLowerCase();
return items.filter(item => {
return item.name.toLowerCase().includes(searchText);
});
}
}
在组件中使用这个服务:
import { Component } from '@angular/core';
import { FilterService } from './filter.service';
@Component({
selector: 'app-root',
template: `
<div *ngFor="let item of filteredItems">
{{ item.name }}
</div>
`
})
export class AppComponent {
items = [
{ name: 'Apple' },
{ name: 'Banana' },
{ name: 'Cherry' }
];
searchText = '';
constructor(private filterService: FilterService) {}
get filteredItems() {
return this.filterService.filterItems(this.items, this.searchText);
}
}
ngx-virtual-scroller
)或优化过滤算法来解决。import { fromEvent } from 'rxjs';
import { debounceTime, map } from 'rxjs/operators';
// 在组件中
fromEvent(this.searchInput.nativeElement, 'input').pipe(
debounceTime(300),
map(event => (event.target as HTMLInputElement).value)
).subscribe(searchText => {
this.filteredItems = this.filterService.filterItems(this.items, searchText);
});
通过上述方法,可以在Angular中高效地实现列表过滤功能,并根据具体需求选择合适的实现方式。
领取专属 10元无门槛券
手把手带您无忧上云