0

我正在使用这个插件来显示一棵树。

它是否有任何功能可以在检查父节点时检查所有子节点?

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

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

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

我们可以删除使用render吗?

4

2 回答 2

0

我也在使用递归解决方案来提高性能,但我找到了一个更有效的替代方案。调用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}]);
    }
}

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

于 2017-09-26T20:58:01.513 回答
0

尝试这个。

编辑引导树视图 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));
    }
};
于 2018-08-21T09:33:58.527 回答