如何在d3.js中将不同元素绑定到同一数据,然后让它们都影响数据?

时间:2019-05-06 19:57:44

标签: javascript d3.js

我是d3.js的新手,并试图通过对某些代码进行简单的修改来学习。 Here's the original code,在图形上有一些点,由点连接。

我试图做到这一点,以使所有点都被限制在其x位置,即使它们被拖动但仍在y位置移动。这很容易,我只是在attr('cx', x(d[0]))的{​​{1}}行中注释了。

现在,我正在尝试制作一个点,所以当我拖动一个点时,它也会同时拖动它的相邻点(向左和向右),并且路径仍然从点到相邻点连接(正如您所期望的那样) )。

这就是我尝试过的。创建dragged()的更新/输入后,我通过执行focus.selectAll('circle')cxcy之后添加属性。

然后,在“ dragged()”中,我改为:

.attr('ind', function(d, i) { return i; })

但是,它正在做一些奇怪的事情:

  1. 它会将圆圈拖到我单击的圆圈的左侧,但又将两个圆圈拖到了它的右侧...所以function dragged(d) { var cur_y = y.invert(d3.event.y); var cur_ind = d3.select(this).attr('ind'); focus.selectAll('circle') .attr('cy', function(d, i){ if (Math.abs(i - cur_ind)<=1){ //console.log('i: ' + i + ' cur_ind: ' + cur_ind + ' abs: ' + Math.abs(i - cur_ind)); return y(cur_y); } else{ return y(d[1]); } }); focus.select('path').attr('d', line); } 似乎在做些奇怪的事情?
  2. 如果我单击并拖动一次,然后再在另一个上拖动一次,则之前拖动的圆会重置为原始位置。
  3. 它会拖动除我单击的圆圈之外的所有圆圈...
  4. 它根本不会移动路径/线。

所以我想我不了解如何绑定数据的想法。我以为这个想法是,当我对圆执行Math.abs()部分时,它不仅使用数据enter()对其进行了一次设置,还将其绑定到圆上,因此,如果圆的属性发生了变化,积分也是如此。但显然并非如此。

我已经阅读了更多的内容,看来我的方法没有更新圆所基于的实际点。我做了一个巧妙的解决方法,解决了一些问题,在更改points时做了points[i][1] = cur_y;。现在,它也可以移动路径,但是仍然在很多方面被破坏。

解决这个问题的正确方法是什么?我该如何移动圆,但又要使该移动改变基础数据,因此也改变路径?谢谢!

0 个答案:

没有答案