【发布时间】:2018-07-27 01:17:51
【问题描述】:
问题:
我试图从general update pattern 中了解 d3 退出选择的行为。
注意:我使用的是 d3V5
Fiddle
假设我想可视化数字“1”。
var data = [{id:"1"}];
var text = svg.selectAll('.text').data(data);
text.enter()
.each((d) => console.log("first append " + d))
.append('text')
.text(d => d.id)
一切顺利。但现在说我厌倦了“1”,而对可视化“2”更感兴趣。
data = [{id:"2"}];
text = svg.selectAll('.text').data(data);
text.exit().each((d) => console.log("remove " + d)).remove();
控制台不记录{id:"1"}。此项目未放置在退出选择中。
text.enter()
.each((d) => console.log("now append " + d))
.append('text')
.text(d => d.id)
现在我有一个“1”和一个“2”堆叠在一起。
假设:
我原以为当我这样做时,.data(data) d3 会在 dom 和数据之间进行比较,并将任何没有相应条目的旧 dom 节点放置在退出选择中的 data 中。我原以为数据上的'id' 字段可以区分这些数据元素。情况似乎并非如此。
问题:
如何在退出选择中获得{id:"1"}?
或者如何删除与{id:"1"}关联的dom节点?
【问题讨论】:
-
您只是缺少
data方法中的关键函数,仅此而已。这肯定是重复的,我很快就会找到目标的。 -
哦。我假设
'id'属性在 d3 中默认用作键。我仍然无法用关键功能修复我的小提琴......也许我只是做错了。 -
@GerardoFurtado 仍然无法获得在小提琴上工作的关键功能。想试试吗?
-
你试过
data(data, d => d.id)吗?如果您不使用键功能,则默认使用数组中的索引(对于您的两个示例都是0) -
@AlexLenail 对不起,我以前在手机上,现在我在电脑上,更容易阅读代码。这里的问题不是缺少关键功能(但拥有一个总是很有趣),这里的问题是您选择了一个不存在的类(
.text)。实际上,您只是没有选择任何内容(请阅读我的explanation here)。这是按标签选择的相同代码:jsfiddle.net/hbzgoeu8
标签: javascript d3.js