我想你正在使用 d3 v4.x。在这种情况下,这就是预期的行为。
这就是正在发生的事情:userNodes
是数据绑定变量:
var userNodes = d3.select("#users").selectAll("li")
.data(d3.values(users));
然后,你写:
userNodes.enter()
.append("li");
这就是“输入”选择。
在 d3 v3.x 中输入选择神奇地修改你的原始变量,将其变成这样:
var userNodes = d3.select("#users").selectAll("li")
.data(d3.values(users));
.enter()
.append("li");
但是,在 d3 v4.x 中,原始变量仍然只是数据绑定选择:
var userNodes = d3.select("#users").selectAll("li")
.data(d3.values(users));
所以,如果我们重写你的userMessageGraph
考虑到链接,这就是它的实际情况:
var userMessageGraph = d3.select("#users")//here userNode starts
.selectAll("li")
.data(d3.values(users))//this is where userNode ends
.selectAll("span")
.data(function(d){ return [d.name]; })
.enter().append("span")
.text(function(d){ return d; });
您可以看到“输入”选择<li>
,这是...
.enter()
.append("li")
...不见了。
EDIT:此编辑解决了 OP 的新代码:
var userNodes = d3.select("#users").selectAll("li")
.data(d3.values(users));
// Add LIs for any new users
userNodes.enter()
.append("li")
// New for V4, merge back the original set to get the data
.merge(userNodes);
这行不通是有原因的:merge
功能...
...返回一个新的选择,将该选择与指定的其他选择合并。返回的选择具有相同数量的组和相同的父项this选择。 (强调我的)
As userNodes
是一个空选择,这将不起作用。您可以反转逻辑:
var userNodes = d3.select("#users").selectAll("li")
.data(d3.values(users));
var userNodesEnter = userNodes.enter()
.append("li");
var userNodesUpdate = userNodesEnter.merge(userNodes);
var userMessageGraph = userNodesUpdate.selectAll("span")
.data(function(d) {
return [d.name];
})
.enter().append("span")
.text(function(d) {
return d;
});