D3:基于 svg 元素操作更改数据
D3: change data based on svg element manipulation
我是 [d3.js][1] 的新手,所以我的问题可能很愚蠢。
我将我的 svg 划分为区域,并附加了圆圈供用户拖动。每个区域都有一个 id,每个圈子都有创建它所在区域的 id。
我需要更新链接到放置事件中的圆的 DATUM。反过来也很简单,因为当您更改数据时,update() 事件会完成所有工作。但是有没有办法让svg元素改变数据呢?
编辑:
部分代码。我进行了编辑,使其更清晰、更直接。圆圈调用拖动对象,一切正常,但 TODO 部分需要...嗯...完成:
var drag;
function configDrag () {
drag = d3.behavior.drag();
drag.on("dragstart", function() {
d3.event.sourceEvent.stopPropagation();
})
.origin(function(d){
return d;
})
.on("dragstart", draggrab)
.on("drag", dragmove)
.on("dragend", dragdrop);
}
function dragdrop(d){
reg = regionOf(d.x, d.y); // null if in undefined region
if(reg){
d3.select(this)
.attr("cy", parseInt(reg.y1 + reg.y2) / 2);
var regionId = getRegionId(d.x, d.y);
// TODO update data.tsv with regionId
}
}
}
当您使用 selection.data(values)
将数据绑定到选择时,values
始终是一个数组,通常是 object
个元素的数组。这些元素或对它们的引用绑定到 DOM 元素,可以使用 selection.datum()
检索。它们也是 d
参数,通常是各种 d3 运算符方法传递给回调的第一个参数。因为它们是对象,所以当您更改其成员的值时,您将更改关联元素成员的值,在绑定的原始 values
数组中。
我是 [d3.js][1] 的新手,所以我的问题可能很愚蠢。
我将我的 svg 划分为区域,并附加了圆圈供用户拖动。每个区域都有一个 id,每个圈子都有创建它所在区域的 id。
我需要更新链接到放置事件中的圆的 DATUM。反过来也很简单,因为当您更改数据时,update() 事件会完成所有工作。但是有没有办法让svg元素改变数据呢?
编辑:
部分代码。我进行了编辑,使其更清晰、更直接。圆圈调用拖动对象,一切正常,但 TODO 部分需要...嗯...完成:
var drag;
function configDrag () {
drag = d3.behavior.drag();
drag.on("dragstart", function() {
d3.event.sourceEvent.stopPropagation();
})
.origin(function(d){
return d;
})
.on("dragstart", draggrab)
.on("drag", dragmove)
.on("dragend", dragdrop);
}
function dragdrop(d){
reg = regionOf(d.x, d.y); // null if in undefined region
if(reg){
d3.select(this)
.attr("cy", parseInt(reg.y1 + reg.y2) / 2);
var regionId = getRegionId(d.x, d.y);
// TODO update data.tsv with regionId
}
}
}
当您使用 selection.data(values)
将数据绑定到选择时,values
始终是一个数组,通常是 object
个元素的数组。这些元素或对它们的引用绑定到 DOM 元素,可以使用 selection.datum()
检索。它们也是 d
参数,通常是各种 d3 运算符方法传递给回调的第一个参数。因为它们是对象,所以当您更改其成员的值时,您将更改关联元素成员的值,在绑定的原始 values
数组中。