升级Angular至v15后遇FilterUtils导出错误,求无代码改动替代方案
Angular升级至v15后PrimeNG FilterUtils报错的替代方案
PrimeNG适配Angular 15的版本中,FilterUtils已从primeng/utils包中移除,这就是你遇到报错的原因。下面提供两种无需大幅修改原有代码的替代方案:
方案一:自行实现简易版FilterUtils过滤逻辑
直接在组件内实现一个和原FilterUtils.filter逻辑一致的函数,原有业务代码几乎不用改动:
// 移除原来的 import { FilterUtils } from 'primeng/utils'; // 自行实现匹配原逻辑的过滤工具函数 const FilterUtils = { filter: (data: any[], fields: string[], value: any, matchMode: string) => { return data.filter(item => { return fields.some(field => { // 解析嵌套字段(如'validation.status') const targetValue = field.split('.').reduce((obj, key) => obj?.[key], item); if (matchMode === 'contains') { return String(targetValue).toLowerCase().includes(String(value).toLowerCase()); } // 如需其他匹配模式,可在此扩展 return targetValue === value; }); }); } }; // 原业务代码完全保留 filterStatus(event: Switch, dt: Table): void { this.showErrorOnly = event.checked; if (event.checked) { dt.value = FilterUtils.filter(this.data, ['validation.status'], 'INVALID', 'contains'); } else { dt.value = this.data; } dt.reset() }
方案二:使用PrimeNG Table原生过滤功能
这是更符合PrimeNG新版本设计的方案,无需手动处理数据赋值,直接利用Table的内置过滤API:
filterStatus(event: Switch, dt: Table): void { this.showErrorOnly = event.checked; if (event.checked) { // 给指定字段设置过滤条件 dt.filter('INVALID', 'validation.status', 'contains'); } else { // 清除该字段的过滤规则 dt.filter('', 'validation.status', 'contains'); } dt.reset() }
这种方案不需要自己维护过滤逻辑,也能避免后续版本的API变更风险,更推荐使用。
内容的提问来源于stack exchange,提问作者John Mikel
相关产品推荐
相关产品推荐

