2017-09-06 70 views
0

我使用this plugin来显示一棵树。引导树视图性能问题

是否有任何功能会检查父节点时检查所有子节点?

目前我找不到任何方式来做到这一点。

为了实现这个功能我已经写递归函数找到根下的每个节点,并检查使用checkNode功能。

我看到的性能问题时,树的深度超过3大约150个节点。在调查中发现checkNode功能bootstrap-treeview.js使用render每次检查节点时,谁能告诉我使用这个render函数?

我们可以删除使用render

回答

0

我用性能使用递归溶液以及挣扎,但我发现一种更有效的替代方案。到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}]); 
    } 
} 

编辑:修改代码以正确处理最后一个孩子有孩子的情况。