在d3.js中折叠/展开树的子节点?

tf7tbtn2  于 2023-06-23  发布在  其他
关注(0)|答案(4)|浏览(175)

我正在构建一个树结构(或者更确切地说,在我自己的json中使用一组我自己的数据修改其中一个示例),并且我正在尝试创建一些功能:
我的树的布局是从树的例子:http://mbostock.github.com/d3/ex/cluster.html
我正在添加(到圆圈中)一个onclick事件,我想折叠被单击节点的子节点。也就是说,当用户单击与节点关联的steelblue圆圈时,我希望该节点的子节点消失。
我已经搜索了文档,我还没有找到任何可以让节点折叠或消失的东西。
我能怎么办?

tag5nh1u

tag5nh1u1#

有这样的:
http://mbostock.github.com/d3/talk/20111018/tree.html
我的SVG Open keynote中还有许多其他交互式分层布局示例。

eqfvzcg8

eqfvzcg82#

有几种方法,一种是使用常规stying来隐藏子元素的标记(opacity:0,或显示:然而,这只是使数据不可见,树保持其形状,就好像数据在那里一样,你只是看不到它。
通常,你会希望树假装数据不存在并相应地更新,为此,你可以使用与上面链接中的强制定向布局示例相同的方法。
它可以归结为:1)使用函数来构建d3树2)将点击事件附加到可折叠节点3)点击事件重命名节点的children属性并调用1)中的函数,该函数重绘树而不重绘该节点的子节点。
下面是nkoren的答案(http://bl.ocks.org/1062288)中链接的相关代码:

function update() { 
    // build the tree layout here
    //  append on("click", click) to the collapsible nodes
}

// Toggle children on click
function click(d) {
  if (d.children) {
    d._children = d.children;
    d.children = null;
  } else {
    d.children = d._children;
    d._children = null;
  }
  update();
}
zpf6vheq

zpf6vheq3#

不幸的是,我仍然在与D3的速度,不知道如何最好地回答您的问题。但是这里有一个强制定向布局,它允许你通过点击来显示/隐藏节点,这可能会给予你一些启发:http://bl.ocks.org/1062288

zrfyljdw

zrfyljdw4#

创建一个折叠函数,仅当节点有子节点时,单击该函数时才会执行。我分享了下面的代码,它对我很有用:

collapse = (d) => {
    if (d.children) {
      d._children = d.children;
      d._children.forEach((d) => this.collapse(d));
      d.children = null;
    }
  }

  click = (d) => {
    console.log('click: ', d);
    if (d.children) {
      this.collapse(d);
      d.children = null;
    } else {
      d.children = d._children;
      d._children = null;
    }
    this.updateChart(d);
  }

相关问题