我正在使用这个插件来显示一棵树。
它是否有任何功能可以在检查父节点时检查所有子节点?
目前我找不到任何方法来做到这一点。
为了实现这个功能,我编写了递归函数来查找根目录下的每个节点并检查使用checkNode
函数。
当大约 150 个节点的树深度超过 3 时,我看到了性能问题。在调查中,我发现每次检查节点时使用的功能,谁能告诉我这个checkNode
功能的bootstrap-treeview.js
用途?render
render
我们可以删除使用render
吗?
我正在使用这个插件来显示一棵树。
它是否有任何功能可以在检查父节点时检查所有子节点?
目前我找不到任何方法来做到这一点。
为了实现这个功能,我编写了递归函数来查找根目录下的每个节点并检查使用checkNode
函数。
当大约 150 个节点的树深度超过 3 时,我看到了性能问题。在调查中,我发现每次检查节点时使用的功能,谁能告诉我这个checkNode
功能的bootstrap-treeview.js
用途?render
render
我们可以删除使用render
吗?
我也在使用递归解决方案来提高性能,但我找到了一个更有效的替代方案。调用checkAll
速度很快,即使是大树,因为它只调用一次render
,而这种检查的递归实现使用checkNode
将不必要地调用render
多次,正如您所指出的。
我在文档中找不到这个,但我注意到它的实现中的checkNode
调用forEachIdentifier
,与 相同checkAll
,所以你实际上可以传入一个节点或 nodeIds 数组,而不仅仅是一个 nodeId,它只会调用render
一次,在检查完所有节点之后。唯一的区别checkAll
是它专门传入了树中的所有 nodeId。
因此,您可以在事件处理程序中添加一些代码,通过查看最后一个子节点的 id 并构建一个范围,然后调用checkNode
一次,为父节点下的所有节点生成 nodeIds 列表。
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}]);
}
}
编辑:修改代码以正确处理最后一个孩子有孩子的情况。
尝试这个。
编辑引导树视图 js 文件。
找到toggleCheckedState函数并替换为下面
Tree.prototype.toggleCheckedState = function (node, options) {
if (!node) return;
this.setCheckedState(node, !node.state.checked, options);
if (node.nodes && !options.ignoreChildren) {
$.each(node.nodes, $.proxy(function (index, node1) {
this.toggleCheckedState(node1,_default.options);
}, this));
}
};