使用6pac/slickgrid 5.15.1调用autosizeColumns报TypeError求助
问题描述
使用6pac/slickgrid 5.15.1版本及slick.remotemodel.js,在Model的DataLoaded事件中调用grid.autosizeColumns()时触发错误,代码如下:
model.onDataLoaded.subscribe(function(e, args) { for (var i = args.from; i <= args.to; ++i) { grid.invalidateRow(i); } grid.updateRowCount(); grid.render(); grid.autosizeColumns(); });
运行后报错:
Uncaught TypeError: this.getDataItem(...) is undefined getRowVal slick.grid.ts:2679 getColContentSize slick.grid.ts:2745 getColAutosizeWidth slick.grid.ts:2608 internalAutosizeColumns slick.grid.ts:2434 autosizeColumns slick.grid.ts:2386
怀疑是调用时机不正确。
解决方案
错误根源是调用autosizeColumns()时,Grid尚未完成新数据的渲染绑定,导致getDataItem()无法获取有效行数据。可通过以下方式调整调用时机:
- 延迟调用(推荐简单场景)
将autosizeColumns()放入setTimeout,让代码延迟到下一个事件循环执行,确保Grid完成渲染:
model.onDataLoaded.subscribe(function(e, args) { for (var i = args.from; i <= args.to; ++i) { grid.invalidateRow(i); } grid.updateRowCount(); grid.render(); setTimeout(() => grid.autosizeColumns(), 0); });
- 监听Grid渲染完成事件(适合复杂场景)
放弃在DataLoaded中直接调用,改为监听Grid的onRendered事件,确保渲染完成后再执行列宽自适应:
model.onDataLoaded.subscribe(function(e, args) { for (var i = args.from; i <= args.to; ++i) { grid.invalidateRow(i); } grid.updateRowCount(); grid.render(); }); grid.onRendered.subscribe(function() { grid.autosizeColumns(); // 若只需执行一次,可取消订阅:grid.onRendered.unsubscribe(arguments.callee); });
注意:如果是分页加载数据,第二种方式会在每次渲染时触发自适应,若不需要重复执行,记得调用后取消订阅该事件。
内容的提问来源于stack exchange,提问作者Sadri Lassoued
相关产品推荐
相关产品推荐

