d3.js 选择的 enter() 部分只被调用一次
d3.js selection's enter() section gets called only once
我正在构建一张地图,上面的气泡代表推文。每隔一段时间,我都会使用 d3.json
询问服务器是否有新的推文,它会 returns 我新推文的位置。
我绑定了这个数组,只包含使用 selectAll.()data()
的新位置,并希望它们在每个带有新数据的新请求中出现在 enter()
部分中。但我只到过一次,尽管数据连接似乎有效。
我在这样创建的 svg 组中添加所有内容:
bubbleGroup = svg.append("g").attr("class", "bubble");
然后我按以下方式添加圆圈:
var circlesSelection = bubbleGroup.selectAll("circle")
.data(tweets, function (tweet) {
console.log("We have new data:");
console.log(tweet);
return tweet;
});
circlesSelection.enter()
.append("circle")
.attr("transform", function(tweet) {
console.log("Gets called only once");
return "translate(" + tweet["location"] + ")";})
.attr("r", 5);
因此,虽然第一个日志一直显示,包含数组中的新数据,但第二个日志只显示一次。
这里是对 d3.js 框架有一些根本性的误解,还是我的一些小错误?
证明此行为的页面如下:example
您正在登录两个完全不同的上下文——首先是在数据连接的关键函数中,然后是在输入选择中。第一个日志将至少为数据数组中的每个元素调用一次,因为该函数的目的是 return 一个告诉 D3 如何匹配数据和 DOM 元素的键。第二个将为每个新数据元素调用一次(即它无法与现有的 DOM 元素匹配)。
如果您期望的所有元素都没有出现在输入选择中,您需要调整您的键功能——特别是,我会使用 tweet.tid
作为您的键。
我正在构建一张地图,上面的气泡代表推文。每隔一段时间,我都会使用 d3.json
询问服务器是否有新的推文,它会 returns 我新推文的位置。
我绑定了这个数组,只包含使用 selectAll.()data()
的新位置,并希望它们在每个带有新数据的新请求中出现在 enter()
部分中。但我只到过一次,尽管数据连接似乎有效。
我在这样创建的 svg 组中添加所有内容:
bubbleGroup = svg.append("g").attr("class", "bubble");
然后我按以下方式添加圆圈:
var circlesSelection = bubbleGroup.selectAll("circle")
.data(tweets, function (tweet) {
console.log("We have new data:");
console.log(tweet);
return tweet;
});
circlesSelection.enter()
.append("circle")
.attr("transform", function(tweet) {
console.log("Gets called only once");
return "translate(" + tweet["location"] + ")";})
.attr("r", 5);
因此,虽然第一个日志一直显示,包含数组中的新数据,但第二个日志只显示一次。
这里是对 d3.js 框架有一些根本性的误解,还是我的一些小错误?
证明此行为的页面如下:example
您正在登录两个完全不同的上下文——首先是在数据连接的关键函数中,然后是在输入选择中。第一个日志将至少为数据数组中的每个元素调用一次,因为该函数的目的是 return 一个告诉 D3 如何匹配数据和 DOM 元素的键。第二个将为每个新数据元素调用一次(即它无法与现有的 DOM 元素匹配)。
如果您期望的所有元素都没有出现在输入选择中,您需要调整您的键功能——特别是,我会使用 tweet.tid
作为您的键。