我也在使用递归解决方案来提高性能,但我找到了一个更有效的替代方案。对checkAll 的调用很快,即使是大树,因为它只对render 进行一次调用,而使用checkNode 进行此检查的递归实现将不必要地调用render 多次,正如您所指出的.
我在文档中找不到这个,但我注意到checkNode 在其实现中调用forEachIdentifier,与checkAll 相同,因此您实际上可以传入节点或nodeIds 数组,而不是只是一个nodeId,它只会调用一次render,在检查完所有节点之后。 checkAll 的唯一区别是它专门传入了树中的所有 nodeId。
因此,您只需在事件处理程序中添加一些代码,即可通过查看最后一个子节点的 id 并构建一个范围,为父节点下的所有节点生成 nodeId 列表,然后调用checkNode 一次。
function onNodeChecked(event, node_data) {
var first_index, last_index, last_node, nodes, range, i;
nodes = node_data.nodes;
if (nodes != null) {
first_index = node_data.nodeId;
last_node = nodes[nodes.length - 1];
while (last_node.nodes != null) {
nodes = last_node.nodes;
last_node = nodes[nodes.length - 1];
}
last_index = last_node.nodeId;
range = [];
for (i = first_index; i <= last_index ; i++) {
range.push(i);
}
return $('#tree').treeview('checkNode', [range, {silent: true}]);
}
}
编辑:修改代码以正确处理最后一个孩子有孩子的情况。