Ext JS 6大型TreePanel删除节点后选中父节点报错求助
解决Ext JS 6 Tree组件删除节点后选中父节点报错的问题
我之前在Ext JS 6开发Tree组件时也踩过这个一模一样的坑!你遇到的“无法找到请求的节点”错误,本质是删除节点后Tree视图的DOM更新是异步的——你立刻调用ensureVisible时,父节点对应的DOM元素还没完成重新渲染,框架的getById方法自然找不到目标节点。
给你几个亲测有效的解决方案:
方案1:通过Store的remove事件延迟执行
删除节点后,监听TreeStore的remove事件,用Ext.defer延迟调用ensureVisible,给视图足够的更新时间:
// 假设你是通过store删除节点 yourTreeStore.on('remove', function(store, deletedNode) { const parentNode = deletedNode.parentNode; // 延迟100ms执行,时间可根据Tree大小调整 Ext.defer(() => { this.treeController.getTree().ensureVisible(parentNode.getPath()); }, 100); }, this, { single: true }); // single:true确保只触发一次,避免重复执行
方案2:手动刷新视图后再操作
先调用TreeView的refresh()方法强制更新视图,再延迟执行ensureVisible:
const parentNode = parentOfTheDeletedNode; // 先刷新视图 this.treeController.getTree().getView().refresh(); // 短延迟后执行ensureVisible Ext.defer(() => { this.treeController.getTree().ensureVisible(parentNode.getPath()); }, 50);
方案3:确保父节点已渲染(针对虚拟滚动场景)
如果你的Tree用了虚拟滚动,父节点可能是未渲染到DOM的“虚拟节点”,可以先展开父节点(展开操作会触发节点渲染)再执行操作:
const parentNode = parentOfTheDeletedNode; // 如果父节点是折叠状态,先展开它 if (!parentNode.isExpanded()) { parentNode.expand(false, () => { // 展开完成后执行ensureVisible this.treeController.getTree().ensureVisible(parentNode.getPath()); }); } else { Ext.defer(() => { this.treeController.getTree().ensureVisible(parentNode.getPath()); }, 50); }
核心逻辑就是:等Tree视图完成DOM更新后,再调用ensureVisible,这样框架的getById就能找到父节点对应的DOM元素了。
内容的提问来源于stack exchange,提问作者Vayas Zsolt Marton
相关产品推荐
相关产品推荐

