D3.js:enter(),update,exit(),中间有组元素
d3.js: enter(), update, exit() with group element in between
当我使用 D3 渲染可视化并进入、更新、退出模式时,我的 DOM 结构如下所示.js:
g
rect
...
g
rect
...
g
rect
...
我正在我的组中使用多个元素和嵌套选择,但为简单起见,我将用矩形演示这一点。DOM 通过以下方式完成:
group = d3.select('.svg-content')
.selectAll('g')
.data(items, function (item) { return item.Id; });
groupEnter = group.enter()
.append('svg:g')
.attr('class','group-content');
// enter
groupEnter.append('svg:rect')
.style('fill', '#000')
.attr('x', function (item) { return item.x })
.attr('y', function (item) { return item.y; })
.attr('width', function (item) { return item.width; })
.attr('height', function (item) { return item.height; });
// update
group.select('rect')
.attr('x', function (item) { return item.x })
.attr('width', function (item) { return item.width; });
// remove
group.exit().remove();
这行得通!
现在我想实现以下目标:
g
g
rect
...
g
g
rect
...
g
g
rect
...
我想将矩形封装在另一个组元素中。
group = d3.select('.svg-content')
.selectAll('g')
.data(items, function (item) { return item.Id; });
groupEnter = group.enter()
.append('svg:g')
.attr('class','group-content');
// enter
groupEnter
.append('svg:g') // NEW
.attr('class','rect-content') // NEW
.append('svg:rect')
.style('fill', '#000')
.attr('x', function (item) { return item.x })
.attr('y', function (item) { return item.y; })
.attr('width', function (item) { return item.width; })
.attr('height', function (item) { return item.height; });
// update
group
.select('.rect-content') // NEW
.select('rect')
.attr('x', function (item) { return item.x })
.attr('width', function (item) { return item.width; });
// remove
group.exit().remove(); // NOTE: without this, it works!
这段代码有什么问题?如果没有删除块,它可以工作,但我需要它来处理新的/删除的项目。如何使它正确?
问题是您正在选择要将数据绑定到的普通g
元素(.selectAll('g').data(...)
)。当这些元素只有一个级别时,这工作正常,但是由于.selectAll()
递归工作,它将选择比您拥有嵌套结构时想象的更多的元素。
也就是说,所选内容包含更多元素,这些元素"使用"绑定数据。因此,数据最终不会与正确的元素匹配。
要解决此问题,只需使选择器更具体:
group = d3.select('.svg-content')
.selectAll('g.group-content')
.data(...);
在此处完成演示。
相关文章:
- 仅当具有相同类的元素的中间使用 jQuery 航点到达视口时,才淡入具有相同类的元素
- D3.js:enter(),update,exit(),中间有组元素
- 如何调整jQuery动画以使元素保持在中间
- 在关联阵列的中间拼接一个元素
- 我怎样才能把元素放在垂直排列的中间
- 到达(窗口)上的中间元素.滚动
- jQuery-将元素滚动到屏幕中间,而不是使用锚链接滚动到顶部
- DIV 中的 CSS 中心中间元素,用于多种屏幕尺寸
- 为什么在DOM中插入中间非标准元素会破坏flex框
- JQuery将一个元素设置在另一个元素的中间
- 合并两个段落并删除中间的一个元素
- 在切换按钮中间找到元素[Upvote/Downvote/unvote like SO]
- 如何查找html元素是否应用了换行,并且该单词在文本中间断开
- 用jQuery从中间到顶部动画多个元素
- React -从列表中间删除最后一个元素
- 如何重新排列页面中间两个元素的制表符顺序?
- 为什么在包含100个元素的数组中搜索中间元素要比在包含10个元素的数组中搜索快?
- 使HTML表格的高度等于中间TD元素的高度
- 如何编辑一个jQuery动画,使其出现在元素的中间
- Javascript:在屏幕中间显示元素dons'不要在固定的岗位上工作