javascript - d3 : Why does this function not remove elements?

标签 javascript coffeescript d3.js

在 d3 中工作时,我有一个函数调用可以正确绘制条形图,但它无法正确更新它。这是我的代码的重要部分:

  # Drawing Elements
  @svg = d3.select(@s).append('svg').attr('width',@w).attr('height',@h)
  @rects = @svg.selectAll('rect')
  @labels = @svg.selectAll('text')

  drawRects: (data) ->
    rects = @rects.data(data)
    rects.enter().append('rect')
    rects.exit().remove()
    rects.attr('x', (d,i) => this.xScale(i) )
      .attr('y', (d) => @h - this.yScale(d) )
      .attr('width', @w / @data.length - @pad)
      .attr('height', (d) => this.yScale(d) )
      .attr('fill','#FFC05C')


  drawLabels: (data) ->
    labels = @labels.data(data)
    labels.enter().append('text')
    labels.exit().remove()
    labels.text( (d) -> d )
      .attr('text-anchor','middle')
      .attr('x', (d,i) => this.xScale(i) + ((@w / @data.length - @pad)/2) )
      .attr('y', (d) => @h - this.yScale(d) + 15 )
      .attr('fill','white')

  update: (data) ->
    this.drawRects(data)
    this.drawLabels(data)

当我最初设置图表时,我创建了一些数据(在本例中是一个包含 20 个数字的数组)并调用绘制方法:

data = [1..20]
this.drawRects(data)
this.drawLabels(data)

图表绘制正确。

但是,如果第二次调用这些方法来更新数据,新数据将放置在 DOM 中,但旧数据也会留下,因此它只是创建一组全新的元素。

我在这里做错了什么,导致 .exit() 无法删除旧的 DOM 元素?

最佳答案

您需要重新选择 recttext 元素并为其分配新数据:

drawRects: (data) ->
    rects = @svg.selectAll('rect').data(data)
    #...

drawLabels: (data) ->
    labels = @svg.selectAll('text').data(data)
    #...

在代码中,您始终将新数据分配给旧的(空)@rect 和(空)@labels 集合。对于这些空集合,数据将被视为“输入”,因此将创建新元素,并且不会删除任何内容。

关于javascript - d3 : Why does this function not remove elements?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13881749/

相关文章:

javascript - jQuery 将参数发送到 Rails 应用程序以保存在数据库中

javascript - 创建一个函数并将其返回值分配给一个变量

javascript - CoffeeScript - 功能正在运行,但它是 "is not a function"

javascript - Angular - 检查数据是否存在?

javascript - 在 CompositeView 中序列化数据

JavaScript : Creating a dynamic table with column title on the first row and row title in the first column

coffeescript - 让 emberjs 入门套件与 coffeescript 一起工作

Javascript:如何覆盖整个区域?

javascript - 如何使用 d3 生成任意数量的颜色?

javascript - D3 中的嵌套 SVG 选择