Kendo Grid共享数据源切换标签页时出现Cannot read property 'sort' of null错误
问题排查与解决方案
看起来你遇到的问题核心在于无效的Grid实例被纳入同步逻辑,以及数据源同步的逻辑方向错误,导致切换标签页时访问到了已经失效的数据源对象,触发Cannot read property 'sort' of null错误。下面一步步帮你解决:
1. 先过滤掉无效的Grid实例
你的getEquipmentGrids函数现在会把所有匹配ID前缀的元素都纳入,但切换标签页时,非活跃标签页的Grid可能已经被销毁(或者DOM虽然存在但Grid实例已失效),导致data("kendoGrid")返回null。修改这个函数,只保留有效的Grid:
function getEquipmentGrids() { var grids = []; $.each($("[id|='equipmentGridReview']"), function(idx, element) { var grid = $(element).data("kendoGrid"); // 只添加存在且拥有有效数据源的Grid实例 if (grid && grid.dataSource) { grids.push(grid); } }); return grids; }
2. 修正数据源同步的逻辑
你原来的setCommonDateSource逻辑是把新Grid的数据源替换成其他Grid的,这完全搞反了方向——应该是把新绑定完成的Grid的数据同步给其他有效Grid,而不是反过来。而且直接替换数据源会丢失Grid原有的配置(比如排序、过滤规则),正确的做法是同步数据和状态:
function setCommonDateSource(newGrid) { // 先确保当前Grid是有效的 if (!newGrid || !newGrid.dataSource) return; var validGrids = getEquipmentGrids(); $.each(validGrids, function(idx, grid) { if (grid !== newGrid) { // 同步数据 grid.dataSource.data(newGrid.dataSource.data()); // 同步排序状态(如果有的话) var sortConfig = newGrid.dataSource.sort(); if (sortConfig) { grid.dataSource.sort(sortConfig); } // 同步过滤状态(如果需要的话) var filterConfig = newGrid.dataSource.filter(); if (filterConfig) { grid.dataSource.filter(filterConfig); } } }); }
3. 处理标签页切换时的Grid状态
很多标签页组件(比如Kendo TabStrip)在切换时会隐藏非活跃标签页的DOM,甚至销毁Grid实例。你需要监听标签页的激活事件,确保可见的Grid处于有效状态:
如果用的是Kendo TabStrip,可以添加如下监听:
// 假设你的TabStrip ID是"tabStrip" $("#tabStrip").kendoTabStrip({ activate: function(e) { // 激活标签页后,刷新当前标签页内的Grid var currentGrid = $(e.contentElement).find("[id|='equipmentGridReview']").data("kendoGrid"); if (currentGrid) { currentGrid.refresh(); } } });
为什么之前会报错?
- 切换标签页时,
getEquipmentGrids拿到了已经失效的Grid实例(DOM存在但Grid已被销毁),grid.dataSource为null,后续访问grid.dataSource.sort()就会抛出Cannot read property 'sort' of null。 - 原逻辑中把新Grid的数据源替换成旧Grid的,一旦旧Grid失效,新Grid的数据源就变成了
null,触发错误。
这样调整后,就能保证只有有效的Grid参与同步,而且数据同步的方向正确,标签页切换时也能维持Grid的有效状态。
内容的提问来源于stack exchange,提问作者Stas Zgurskiy
相关产品推荐
相关产品推荐

