我使用this plugin来显示一棵树。引导树视图性能问题
是否有任何功能会检查父节点时检查所有子节点?
目前我找不到任何方式来做到这一点。
为了实现这个功能我已经写递归函数找到根下的每个节点,并检查使用checkNode
功能。
我看到的性能问题时,树的深度超过3大约150个节点。在调查中发现checkNode
功能bootstrap-treeview.js
使用render
每次检查节点时,谁能告诉我使用这个render
函数?
我们可以删除使用render
?
我使用this plugin来显示一棵树。引导树视图性能问题
是否有任何功能会检查父节点时检查所有子节点?
目前我找不到任何方式来做到这一点。
为了实现这个功能我已经写递归函数找到根下的每个节点,并检查使用checkNode
功能。
我看到的性能问题时,树的深度超过3大约150个节点。在调查中发现checkNode
功能bootstrap-treeview.js
使用render
每次检查节点时,谁能告诉我使用这个render
函数?
我们可以删除使用render
?
我用性能使用递归溶液以及挣扎,但我发现一种更有效的替代方案。到checkAll
呼叫速度快,即使有大的树,因为它只能在render
单呼,而递归实现使用checkNode
此检查将调用render
多次不必要的,正如你所指出。
的文档中我找不到这一点,但我注意到,checkNode
电话forEachIdentifier
在其执行情况,checkAll
一样的,所以实际上你可以通过在节点或nodeIds的阵列,而不是只是一个单一的节点ID,在检查完所有节点后,它只会调用render
一次。 checkAll
的唯一区别在于它特别传递树中的所有nodeIds。
因此,您可以在事件处理程序中添加一些代码,通过查看最后一个子节点的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}]);
}
}
编辑:修改代码以正确处理最后一个孩子有孩子的情况。