如何重新加载Kendo TreeView完整分支(父+子节点)及解决DEMO问题
解决Kendo TreeView父节点全选后展开无法重新加载子节点的问题
我完全懂你碰到的这个麻烦——手动勾选子节点后折叠再展开,子节点能正常刷新,但通过父节点全选所有子节点后,再折叠展开就没法重新加载子节点了。这大概率是因为父节点全选操作悄悄改变了节点的内部状态(比如标记子节点为「已加载」),导致TreeView默认的展开逻辑直接跳过了重新请求数据的步骤。
下面给你几个实用的解决方案,按从易到难的顺序整理:
方案1:在onExpand事件中强制触发子节点重载
不管当前节点的选中状态如何,直接强制重置节点加载状态并触发数据源读取,覆盖TreeView的默认判断逻辑。
function onExpand(e) { const treeView = $("#treeview").data("kendoTreeView"); const dataItem = treeView.dataItem(e.node); // 强制标记子节点未加载,确保展开时重新请求 dataItem.loaded = false; // 重新读取该节点的子节点数据 treeView.dataSource.read({ parentId: dataItem.id }); // 可选:如果需要保留选中状态,在数据加载完成后重新勾选 const wasChecked = treeView.isChecked(e.node); if (wasChecked) { treeView.uncheck(e.node); // 绑定一次性dataBound事件,数据加载完成后递归勾选 treeView.one("dataBound", () => { treeView.check(e.node, true); }); } }
方案2:拦截父节点全选事件,重置子节点加载状态
当用户勾选父节点触发全选时,主动将所有子节点的loaded属性设为false,为后续展开重载做准备。
function onCheck(e) { const treeView = $("#treeview").data("kendoTreeView"); const dataItem = treeView.dataItem(e.node); // 只处理有子节点的父节点 if (!dataItem.hasChildren) return; const isChecked = treeView.isChecked(e.node); if (isChecked) { // 遍历所有子节点,重置loaded状态 const childNodes = treeView.items(e.node).find(".k-item"); childNodes.each(function() { const childItem = treeView.dataItem(this); childItem.loaded = false; }); } }
记得把onCheck事件绑定到TreeView配置里:
$("#treeview").kendoTreeView({ // 其他配置项... check: onCheck, expand: onExpand });
方案3:自定义数据源,绕过默认缓存逻辑
修改HierarchicalDataSource的读取逻辑,确保每次展开节点都重新请求数据,彻底忽略节点的「已加载」标记。
const dataSource = new kendo.data.HierarchicalDataSource({ transport: { read: { url: "/your-data-api", dataType: "json" } }, schema: { model: { id: "id", hasChildren: "hasChildren" } }, // 重写fetch方法,强制每次都发起新请求 fetch: function(options) { options = options || {}; this._transport.read( $.extend({}, options.data, { parentId: this.options.parentId }), options.success, options.error ); } });
核心原因说明
Kendo TreeView默认会把已加载过的子节点标记为loaded: true,展开时会跳过数据请求。而父节点全选操作会自动遍历并选中所有子节点,这个过程中可能会提前加载子节点(哪怕你没手动展开过),或者直接标记它们为已加载,导致后续展开时不再触发数据读取。上面的方案要么强制重置loaded状态,要么绕过默认缓存逻辑,确保每次展开都重新拉取最新数据。
你可以根据自己的业务场景选合适的方案,一般方案1+方案2组合起来就能解决大部分问题了。
内容的提问来源于stack exchange,提问作者Francis Lim
相关产品推荐
相关产品推荐

