enter() 和 exit() 如何检测 D3 中的更新数据
How are enter() and exit() detecting updated data in D3?
我正在构建一个小的UI,用户必须在显示的两个SVG中的每一个上选择一个点。
然后,这些点坐标将显示在 SVG 下。我想使用 D3 的数据绑定和 enter()
和 exit()
方法来实现这一点。但是,D3 似乎并不总是更新我显示点坐标的部分,即使我对绑定元素调用 enter()
方法也是如此。但是,删除数据时,exit()
方法有效。
这是主要代码:
function showPoints() {
var coordinatesElements = d3.select('#coordinates').selectAll('.point').data(points);
coordinatesElements.enter().append('div').classed('point', true)
.text(function (d) {
var textParts = [];
if (d.firstSvg) { textParts.push('first : '+JSON.stringify(d.firstSvg)); }
if (d.secondSvg) { textParts.push('second : '+JSON.stringify(d.secondSvg)); }
return textParts.join(' - ');
})
.append("span")
.classed('removeCalibrationPoint', true)
.html(" X")
.on('click', function(d, i) {
points.splice(i, 1);
showPoints();
});
coordinatesElements.exit().remove();
}
我创建了一个JSBin小提琴来演示这个问题。
第一个问题是你的HTML中有一个空的类point
div
。这将由.selectAll('.point')
选择,并导致数据中的第一个元素不显示。
第二个问题是你没有处理更新选择 - 在某些情况下,你不是在添加新数据,而是修改现有数据。下面的代码更新更新所选内容中的数据的文本。
coordinatesElements.text(function (d) {
var textParts = [];
if (d.firstSvg) { textParts.push('first : '+JSON.stringify(d.firstSvg)); }
if (d.secondSvg) { textParts.push('second : '+JSON.stringify(d.secondSvg)); }
return textParts.join(' - ');
});
在此处完成演示。请注意,我通过仅在更新选择上设置文本来稍微简化了代码 - 从输入选择中添加的元素将合并到更新选择中,因此无需执行两次。
相关文章:
- d3.hexbin插件-动态定义颜色域以适应数据
- 如何为d3.js图表输出组织/嵌套数据
- 添加新数据时D3.JS条形图列偏移量
- 将基本CSV数据加载到D3
- D3 数据解析和筛选
- 带轴的 D3 数据环路计数器(不从 0 开始)
- D3 数据与海量数据重叠问题
- 如何设置我的变量,以便 D3 数据更新找到正确的对象属性
- D3 数据映射:气泡上的单击事件
- D3 数据映射:传入气泡属性的气泡上的 OnClick 事件
- 如何让D3数据驱动文档在正确的时区显示moment.js日期时间
- 如何过滤D3数据
- 使用间隔更新d3数据
- 更新D3数据并不能从仿3d示例中删除旧数据
- D3数据表的第一行排序不正确- D3/DC/Crossfilter
- 导入CSV没有头到D3 -数据与数字和字符串
- D3数据格式,如可缩放的日冕图
- 使用underscorejs和d3数据进行过滤
- 我们如何为d3数据地图创建一个onclick事件?
- D3数据映射:如何根据半径堆叠气泡