javascript - D3更新、输入和删除

标签 javascript d3.js svg

我不确定我错过了什么,我有一个在图表上呈现气泡的函数,我想在新数据可用时调用该函数,但是,它正在顶部创建新的气泡当我调用它时现有的。不是删除和更新吗?我缺少什么?

renderCalls(data){
        let self = this;
        this.bubblePeople = this.canvas.selectAll('.openCalls')
                    .data(data)
                    .enter().append('g')
                    .attr('class', '.openCalls').attr('id', function (d) { return d.index })
                    .attr('transform', function (d) { return "translate(" + (self.getColX(d.x) + 25) + "," + (self.getRowY(d.y) + 25) + ")" })
                    .call(D3['drag']().on("start", this.dragstarted)
                        .on("drag", this.dragged)
                        .on("end", this.dragended.bind(this)));

                this.bubblePeople.append("title").text(function (d) { return d.name + ' (' + d.index + ')' })

                this.bubblePeople.append('circle')
                    .attr('r', 30)
                    .attr('fill', 'red')
                    .attr('fill-opacity', .5)
                    .attr("text-anchor", "middle");




                this.bubblePeople.append('text')
                    .attr('text-anchor', 'middle')
                    .style('fill', 'white')
                    .style('font-size', function (d) { return d.shopcode == 'PSO' ? '14px' : '18px' })
                    .style('font-weight', 'bold')
                    .text(function (d) { return d.shopcode == 'PSO' ? 'PSO (' + d.count + ')' : d.count });

                this.bubblePeople.exit().remove();
    }

最佳答案

this.bubblePeople 是输入选择。您必须对更新选择调用 .exit(),您可以通过将变量设置为等于 .data(data) 的返回值来获得更新选择。从更新选择中,您可以调用 .enter().exit()

我更改了您的变量名称以表示变量引用的选择。

renderCalls(data){
        let self = this;
        this.bubblePeopleUpdate = this.canvas.selectAll('.openCalls').data(data);

        this.bubblePeopleEnter = this.bubblePeopleUpdate.enter().append('g')
                    .attr('class', '.openCalls').attr('id', function (d) { return d.index })
                    .attr('transform', function (d) { return "translate(" + (self.getColX(d.x) + 25) + "," + (self.getRowY(d.y) + 25) + ")" })
                    .call(D3['drag']().on("start", this.dragstarted)
                        .on("drag", this.dragged)
                        .on("end", this.dragended.bind(this)));

                this.bubblePeopleEnter.append("title").text(function (d) { return d.name + ' (' + d.index + ')' })

                this.bubblePeopleEnter.append('circle')
                    .attr('r', 30)
                    .attr('fill', 'red')
                    .attr('fill-opacity', .5)
                    .attr("text-anchor", "middle");




                this.bubblePeopleEnter.append('text')
                    .attr('text-anchor', 'middle')
                    .style('fill', 'white')
                    .style('font-size', function (d) { return d.shopcode == 'PSO' ? '14px' : '18px' })
                    .style('font-weight', 'bold')
                    .text(function (d) { return d.shopcode == 'PSO' ? 'PSO (' + d.count + ')' : d.count });

                this.bubblePeopleUpdate.exit().remove();
    }

关于javascript - D3更新、输入和删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41625055/

相关文章:

javascript - Node js : percentage based string compare

javascript - FormData.delete() 在 for 循环中不能正常工作

javascript - 是否可以在 Mongoose 中相互引用两个模式?

svg - Three.js 3D 空间中的 .svg 资源

javascript - D3 图表中的“圆圈”未出现

javascript - 未捕获的类型错误 : Cannot read property 'ownerDocument' of null - ReactJS

javascript - 拆分对象属性中的字符串并创建新数据集

javascript - 带后台 AJAX 更新的 D3 图表 : cannot redraw graph

javascript - 如何使用 svg.js 绘制圆弧

javascript - 通过javascript基于字符串创建svg元素