新闻中心
Angular数据列表多字段过滤功能的开发实践

本教程详细介绍了如何在angular项目中实现数据列表的多字段模糊搜索功能。通过优化现有的单字段过滤逻辑,我们将展示如何利用`array.prototype.filter`结合逻辑或操作符,同时对用户列表的姓名、姓氏、用户名和邮箱等多个字段进行高效、大小写不敏感的过滤,从而显著提升用户体验和数据检索的灵活性。
在Angular应用开发中,数据列表的过滤功能是常见的需求。通常,用户希望能够通过输入一个关键词,在多个数据字段中进行模糊匹配,以快速定位所需信息。本文将指导您如何将一个仅支持单字段(如姓氏)过滤的功能扩展为支持多字段(如姓名、姓氏、用户名、邮箱)的灵活搜索。
1. 了解现有过滤机制
在原始实现中,过滤功能仅针对用户的lastName字段:
HTML 模板 (片段):
<input type="text" [(ngModel)]="lastname" (input)="Search()"/> <!-- ... mat-table ... -->
TypeScript 组件逻辑 (片段):
export class GerenciamentoUsuariosListaComponent implements OnInit {
@Input() usuarios: any[] = []; // 当前显示的用户列表
_allUsuarios: any[] = []; // 用于存储原始、完整的用户列表
lastname: string = ''; // 旧的搜索字段名,我们将用更通用的 searchTerm 替换
// ... constructor, ngOnInit, refreshListUser1 ...
Search(){
if(this.lastname != ""){
this.usuarios = this.usuarios.filter(res =>{
return res.lastName.toLocaleLowerCase().match(this.lastname.toLocaleLowerCase());
})
}else if(this.lastname == ""){
// 原始实现中这里会调用 ngOnInit() 重新获取数据,这并非最佳实践。
// 更好的方式是从 _allUsuarios 恢复数据。
this.ngOnInit();
}
}
}上述代码存在两个主要问题:
- 只过滤了lastName一个字段。
- 当搜索框为空时,调用ngOnInit()会重新发起网络请求,这在大多数情况下是不必要的,且效率低下。
2. 优化组件数据管理
为了实现多字段过滤并避免不必要的网络请求,我们需要在组件中维护两份用户列表:一份是完整的原始数据,另一份是用于显示和过滤的数据。
引入 _allUsuarios 存储原始数据: 在组件类中声明一个私有变量 _allUsuarios 来保存从服务获取到的全部用户数据。
修改 refreshListUser1() 方法: 当数据从服务加载完成后,将数据同时赋值给 _allUsu
arios 和 usuarios。usuarios 将是我们在模板中绑定的显示列表。使用通用搜索词 searchTerm: 将 lastname 变量重命名为更具通用性的 searchTerm,以反映它现在可以匹配多个字段。
更新后的组件变量和数据加载:
import { Component, OnInit, Input } from '@angular/core';
import { GerenciamentoUsuariosService } from './gerenciamento-usuarios.service'; // 假设服务路径
export class GerenciamentoUsuariosListaComponent implements OnInit {
@Input() usuarios: any[] = []; // 用于在模板中显示和过滤的用户列表
_allUsuarios: any[] = []; // 存储从服务获取的完整用户列表
searchTerm: string = ''; // 通用搜索关键词
readonly displayedColumns = ['firstName', 'lastName', 'username', 'email', 'actions'];
constructor(private service: GerenciamentoUsuariosService) {}
ngOnInit(): void {
this.refreshListUser1();
}
refreshListUser1() {
this.service.list().subscribe(
resp => {
this._allUsuarios = resp.content; // 将完整数据存储到 _allUsuarios
this.usuarios = [...this._allUsuarios]; // 初始化显示列表为完整列表
console.log(this.usuarios);
}
);
}
// ... Search() 方法将在下一步中更新
}3. 实现多字段过滤逻辑
核心的改变在于 Search() 方法。我们将使用 Array.prototype.filter() 结合逻辑或 (||) 操作符来检查多个字段是否包含搜索关键词。
易通cmseasy免费的企业建站程序3.0 UTF-8 日文版
九州易通科技开发的核心产品易通企业网站系统(CmsEasy3.0)是充分按照SEO最佳标准来开发,营销实用性非常强企业建站系统。灵活的静态化控制,可以自定义字段,自定义模板,自定义表单,自定义URL,交叉绑定分类,地区,专题等多元化定制大大增加了企业网站的各种需求空间。强大的模板自定义可以轻松打造出个性的栏目封面,文章列表,图片列表,下载列表,分类列表,地区列表等等。主体功能列表如下:支持生成ht
0
查看详情
更新后的 Search() 方法:
// ... (组件的其他部分保持不变)
Search() {
// 检查搜索关键词是否为空或只包含空白字符
if (this.searchTerm.trim() !== "") {
const keyword = this.searchTerm.toLocaleLowerCase().trim(); // 转换为小写并去除首尾空格
this.usuarios = this._allUsuarios.filter(res => {
// 对每个字段进行大小写不敏感的模糊匹配,使用 || 连接多个条件
return res.firstName.toLocaleLowerCase().includes(keyword) ||
res.lastName.toLocaleLowerCase().includes(keyword) ||
res.username.toLocaleLowerCase().includes(keyword) ||
res.email.toLocaleLowerCase().includes(keyword);
});
} else {
// 如果搜索关键词为空,则将显示列表重置为完整的原始列表
this.usuarios = [...this._allUsuarios];
}
}
}4. 更新 HTML 模板
最后,将 HTML 模板中的 [(ngModel)] 绑定从 lastname 更新为新的 searchTerm。
更新后的 HTML 模板 (片段):
<input type="text" [(ngModel)]="searchTerm" (input)="Search()"/>
<mat-table [dataSource]="usuarios">
<!-- Name Column -->
<ng-container matColumnDef="firstName">
<mat-header-cell *matHeaderCellDef> Nome </mat-header-cell>
<mat-cell *matCellDef="let element">{{ element.firstName }}</mat-cell>
</ng-container>
<!-- Last Name Column -->
<ng-container matColumnDef="lastName">
<mat-header-cell *matHeaderCellDef>Sobrenome</mat-header-cell>
<mat-cell *matCellDef="let element">{{ element.lastName }}</mat-cell>
</ng-container>
<!-- UserName Column -->
<ng-container matColumnDef="username">
<mat-header-cell *matHeaderCellDef>Username</mat-header-cell>
<mat-cell *matCellDef="let element">{{ element.username }}</mat-cell>
</ng-container>
<!-- Email Column -->
<ng-container matColumnDef="email">
<mat-header-cell *matHeaderCellDef>E-mail</mat-header-cell>
<mat-cell *matCellDef="let element">{{ element.email }}</mat-cell>
</ng-container>
<!-- ... 其他列和操作 ... -->
</mat-table>5. 完整代码示例
gerenciamento-usuarios-lista.component.html
<input type="text" [(ngModel)]="searchTerm" (input)="Search()"/>
<mat-table [dataSource]="usuarios">
<!-- Name Column -->
<ng-container matColumnDef="firstName">
<mat-header-cell *matHeaderCellDef> Nome </mat-header-cell>
<mat-cell *matCellDef="let element">{{ element.firstName }}</mat-cell>
</ng-container>
<!-- Last Name Column -->
<ng-container matColumnDef="lastName">
<mat-header-cell *matHeaderCellDef>Sobrenome</mat-header-cell>
<mat-cell *matCellDef="let element">{{ element.lastName }}</mat-cell>
</ng-container>
<!-- UserName Column -->
<ng-container matColumnDef="username">
<mat-header-cell *matHeaderCellDef>Username</mat-header-cell>
<mat-cell *matCellDef="let element">{{ element.username }}</mat-cell>
</ng-container>
<!-- Email Column -->
<ng-container matColumnDef="email">
<mat-header-cell *matHeaderCellDef>E-mail</mat-header-cell>
<mat-cell *matCellDef="let element">{{ element.email }}</mat-cell>
</ng-container>
<!-- 假设还有 'actions' 列 -->
<ng-container matColumnDef="actions">
<mat-header-cell *matHeaderCellDef> Ações </mat-header-cell>
<mat-cell *matCellDef="let element">
<!-- 您的操作按钮 -->
</mat-cell>
</ng-container>
<mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
</mat-table>gerenciamento-usuarios-lista.component.ts
import { Component, OnInit, Input } from '@angular/core';
// 假设您的服务路径和模型结构
import { GerenciamentoUsuariosService } from './gerenciamento-usuarios.service';
@Component({
selector: 'app-gerenciamento-usuarios-lista',
templateUrl: './gerenciamento-usuarios-lista.component.html',
styleUrls: ['./gerenciamento-usuarios-lista.component.css']
})
export class GerenciamentoUsuariosListaComponent implements OnInit {
@Input() usuarios: any[] = []; // 用于在模板中显示和过滤的用户列表
_allUsuarios: any[] = []; // 存储从服务获取的完整用户列表
searchTerm: string = ''; // 通用搜索关键词
readonly displayedColumns = ['firstName', 'lastName', 'username', 'email', 'actions'];
constructor(private service: GerenciamentoUsuariosService) {}
ngOnInit(): void {
this.refreshListUser1();
}
refreshListUser1() {
this.service.list().subscribe(
resp => {
this._allUsuarios = resp.content; // 将完整数据存储到 _allUsuarios
this.usuarios = [...this._allUsuarios]; // 初始化显示列表为完整列表
console.log(this.usuarios);
},
error => {
console.error('Error fetching user list:', error);
// 处理错误情况,例如显示错误消息
}
);
}
Search() {
// 检查搜索关键词是否为空或只包含空白字符
if (this.searchTerm.trim() !== "") {
const keyword = this.searchTerm.toLocaleLowerCase().trim(); // 转换为小写并去除首尾空格
this.usuarios = this._allUsuarios.filter(res => {
// 对每个字段进行大小写不敏感的模糊匹配,使用 || 连接多个条件
return (res.firstName && res.firstName.toLocaleLowerCase().includes(keyword)) ||
(res.lastName && res.lastName.toLocaleLowerCase().includes(keyword)) ||
(res.username && res.username.toLocaleLowerCase().includes(keyword)) ||
(res.email && res.email.toLocaleLowerCase().includes(keyword));
});
} else {
// 如果搜索关键词为空,则将显示列表重置为完整的原始列表
this.usuarios = [...this._allUsuarios];
}
}
}注意事项:
- 空值检查: 在进行 toLocaleLowerCase() 或 includes() 操作之前,最好检查字段是否存在(例如 res.firstName && res.firstName.toLocaleLowerCase().includes(keyword)),以防止某些用户对象缺少特定字段时抛出错误。
- 性能优化: 对于非常庞大的数据集(数千条甚至更多),客户端进行全量过滤可能会影响性能。在这种情况下,考虑将过滤逻辑迁移到后端服务器,让服务器负责数据检索和过滤,只返回匹配的结果。
- 防抖 (Debounce): (input) 事件会在每次按键时触发 Search() 方法。为了避免过于频繁的过滤操作(尤其是在用户快速输入时),可以考虑引入防抖机制,例如使用 rxjs 的 debounceTime 操作符,在用户停止输入一段时间后才执行搜索。
- 用户体验: 可以在搜索框旁边添加一个清除按钮,方便用户快速清空搜索内容。
总结
通过以上步骤,我们成功地将一个基本的单字段过滤功能扩展为强大的多字段模糊搜索。核心思想是维护一份完整的原始数据列表,并在每次搜索时从这份原始数据中进行过滤,同时利用 Array.prototype.filter 和逻辑或操作符实现对多个字段的灵活匹配。这种方法不仅提高了代码的复用性和可维护性,也极大地增强了用户在数据列表中的检索能力。
以上就是Angular数据列表多字段过滤功能的开发实践的详细内容,更多请关注其它相关文章!
# 自定义
# 福州建设网站哪家好
# 武汉seo网络营销推广公司排名
# 手淘搜索查关键词排名
# 推广微信商场营销方案
# 江苏seo运营推广平台
# 门户网站建设投入
# 正规seo优化趋势
# 广东360seo
# 潍坊网站网站建设
# seo网站推广 培训
# 原始数据
# 您的
# 企业建站
# 为空
# 易通
# css
# 用户列表
# 多个
# 关键词
# 多字
# 应用开发
# 邮箱
# ios
# ai
# 后端
# app
# typescript
# go
# js
# html
# word
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法
MAC怎么让Dock栏只显示当前运行的应用_MAC终端命令实现极简Dock栏
PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符
内存检查:在VS Code中调试C++时的内存视图
一加手机拍照效果不好怎么办 一加哈苏影像调校与专业模式使用教程【高手篇】
J*a里如何实现订单支付与库存同步功能_支付库存同步项目开发方法说明
Android Studio计算器C键功能异常排查与修复教程
蛙漫移动版在线看 蛙漫手机浏览器直达入口
黑鲨3Pro怎样在相册开漫画风滤镜_iPhone黑鲨3Pro相册开漫画风滤镜【趣味滤镜】
Go语言中动态执行代码字符串的策略与实践
Lar*el头像管理:图片缩放与旧文件删除的最佳实践
QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问
mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析
12306怎么选座位选到安静区_12306选座安静区域选择策略
J*aScript:在map操作中高效处理空数组
qq邮箱日历功能怎么用_创建日程与会议邀请的技巧
如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式
微博网页版直接访问 微博网页版账号管理快速入口
抖音小游戏合成大西瓜免费秒玩入口链接 抖音小游戏热门合集秒玩网站
如何在Python中使用Optional类型处理可变对象并避免Pylint警告
漫蛙网页登录入口 漫蛙漫画官方授权网址
AngularJS $http POST请求数据传递与Go后端接收实践
在J*a中如何使用Stream.map转换元素_Stream映射操作解析
谷歌浏览器如何快速清除某个网站的数据_Chrome网站缓存清理方法
优化大型XML文件解析:基于Python流式处理的内存高效方案
12306选座如何查看座位示意图_12306座位示意图解读与使用
在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明
没有大陆身份证/银行卡如何实名微信? 亲测有效的几种方法分享
京东单号查询入口_京东快递订单追踪入口
聚水潭ERP登录页面入口 聚水潭ERP官网登录界面
C++如何操作大型数据集_使用C++流式处理(Streaming)技术避免一次性加载大文件
小红书怎么解除第三方平台绑定_小红书多平台登录解绑方法介绍
在J*a里如何理解依赖关系的方向_依赖方向在模块结构中的作用
在J*a中如何隐藏复杂性_使用门面模式组织对象交互
如何在CSS中使用visited与link控制链接颜色_visited link伪类配合
Yandex搜索引擎官网入口_俄罗斯Yandex免登录一键直达
解决 MongoDB 聚合查询中对象数组 _id 匹配问题
MongoDB聚合管道:正确匹配对象数组中_id的方法
Typer应用中灵活处理命令行参数的令牌化与解析
J*aScript中针对特定容器内图片动画的实现教程
PHP高效扁平化嵌套数组:使用array_merge与数组解包操作符
taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】
如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践
谷歌google账号怎么注册账号 谷歌账号注册官方流程
ACG动漫视频网入口 ACG动漫*免费正版观看地址
必由学官方网站入口 必由学学生教师共用登录通道
J*aScript中管理异步API调用:确保操作顺序与数据一致性
在Go开发中优雅管理ListenAndServe进程:GoSublime集成方案
Python实时数据流中的动态最值查找策略
C++如何实现单例模式_C++设计模式之线程安全的单例写法


2025-11-20
浏览次数:次
返回列表
arios 和 usuarios。usuarios 将是我们在模板中绑定的显示列表。