Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript D3更新、输入和删除_Javascript_D3.js_Svg - Fatal编程技术网

Javascript D3更新、输入和删除

Javascript D3更新、输入和删除,javascript,d3.js,svg,Javascript,D3.js,Svg,我不确定我缺少的是什么,我有一个函数可以在图表上呈现气泡,我想在有新数据可用时调用该函数,但是,当我调用它时,它会在现有气泡的基础上创建新气泡。它不是在删除和更新吗?我错过了什么 renderCalls(data){ let self = this; this.bubblePeople = this.canvas.selectAll('.openCalls') .data(data)

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

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();
    }

在添加类时,您没有执行“点”,类正在添加。当您选择类时,您使用点。如果您可以创建一个JSFIDLE,那么仍然创建更多气泡而不更新它会有所帮助。我想你还没有设置一个键函数来告诉D3如何解析你的数据。此外,您还必须为更新选择编写代码。事实上,输入和退出可以工作,但无法使更新工作,不确定原因。现在,我将$('.openCalls').remove()放在rmove all中,这样回车键就生效了。您确定在
.data()
中不需要键函数吗?这也是d3.js v3还是v4