代码之家  ›  专栏  ›  技术社区  ›  stephenhay

d3.js树布局:展开一个节点时折叠其他节点?

  •  4
  • stephenhay  · 技术社区  · 12 年前

    在使用d3.js的树布局上( example ),我想折叠不在已单击的分支中的节点。

    例如,在上面的演示中,请尝试以下操作:

    1. 单击“父级1”(显示子级1和子级2)
    2. 点击“Child 1”(显示Child 1.1)
    3. 点击“Child 2”(显示Child 2.1)

    现在,您应该同时看到“Child 1”和“Child 2”的子项。

    我希望发生以下情况:

    1. 单击“父级1”(显示子级1和子级2)
    2. 点击“Child 1”(显示Child 1.1)
    3. 点击“Child 2”(显示Child 2.1, 儿童1.1被隐藏 )

    因此,“活动”分支上以外的节点的子节点应该被隐藏。

    我如何才能最好地解决这个问题?(当然效率很高,因为我将使用一个相当大的数据集)

    2 回复  |  直到 12 年前
        1
  •  8
  •   t.888    12 年前

    一个简单的解决方案是修改单击功能,这样,如果节点有一个父节点,则父节点的每个子节点都会被折叠,但前提是子节点不是被单击的节点。

    function click(d) {
      if (d.children) {
        d._children = d.children;
        d.children = null;
      } else {
        d.children = d._children;
        d._children = null;
      }
      // If the node has a parent, then collapse its child nodes
      // except for this clicked node.
      if (d.parent) {
        d.parent.children.forEach(function(element) {
          if (d !== element) {
            collapse(element);
          }
        });
      }
      update(d);
    }
    

    更新的jsbin: http://jsbin.com/etIJABU/2/edit

        2
  •  1
  •   ramon prata    10 年前

    如果只想在单击具有子节点时折叠其他节点,请在第二个if中添加“&&d.children”。。

    function click(d) {
            if (d.children) {
              d._children = d.children;
              d.children = null;
            } 
            else {
              d.children = d._children;
              d._children = null;
            }
            if (d.parent && d.children) { //add here, 
              d.parent.children.forEach(function(element) {
            if (d !== element) {
            collapse(element);
            }});
          }
            update(d);
          }