Gijgo Grid数字列筛选报错toUpperCase is not a function问题求助
报错根因
Gijgo Grid的默认筛选逻辑统一按字符串类型处理所有字段值,执行筛选时会强制调用字段值的toUpperCase方法实现不区分大小写匹配,而数字类型的值不存在该方法,因此抛出类型错误。
你给年份列设置的type: 'number'仅会生效数字列对应的样式规则,不会触发组件内置的数字筛选逻辑,属于组件本身的适配缺失。
解决方案
以下两种方案可按需选择:
方案1:自定义筛选逻辑(推荐,不改动原始数据类型)
直接在年份列的配置中新增自定义筛选函数,覆盖组件默认的字符串筛选逻辑,适配数字类型匹配:
columns: [ // 其他列配置保持不变 { field: 'CalendarYear', sortable: true, title: 'Year', type: 'number', // 新增自定义筛选逻辑 filter: function(rowValue, filterInputValue) { // 筛选输入为空时直接匹配所有行 if (!filterInputValue) return true; // 统一转为数字做等值匹配,也可根据需求改成大于、小于等逻辑 return Number(rowValue) === Number(filterInputValue); } }, // 其他列配置保持不变 ]
如果你的筛选是通过外部搜索按钮触发reload实现的,可新增全局dataFilter回调自定义所有字段的筛选规则,彻底绕开组件默认的有问题的逻辑:
regChartGrid = $('#regionChartGrid').grid({ // 原有所有配置保持不变 // 新增全局筛选逻辑 dataFilter: function (originalData, filterParams) { if (!filterParams) return originalData; return originalData.filter(item => { // 匹配产品类别 if (filterParams.EnglishProductCategoryName && !item.EnglishProductCategoryName.includes(filterParams.EnglishProductCategoryName)) { return false; } // 匹配区域 if (filterParams.SalesTerritoryRegion && !item.SalesTerritoryRegion.includes(filterParams.SalesTerritoryRegion)) { return false; } // 匹配年份 if (filterParams.CalendarYear && Number(item.CalendarYear) !== Number(filterParams.CalendarYear)) { return false; } return true; }) } });
方案2:转换数据类型(适配简单场景)
如果不需要保留年份的数字类型做后续计算,可以直接在数据源加载时将年份字段统一转为字符串类型,即可直接走组件默认的字符串筛选逻辑,不会触发报错:
// 从localStorage取数后先转换字段类型 var retrievedObject = JSON.parse(localStorage.getItem('stackedRegionChartSourceData')); if (retrievedObject !== null) { // 遍历数据转年份为字符串 retrievedObject.salesByRegQuery.forEach(item => { item.CalendarYear = String(item.CalendarYear); }) // 后续原有逻辑保持不变 }
内容的提问来源于stack exchange,提问作者devvab
相关产品推荐
相关产品推荐

