2013-07-09 25 views
0

我在CoffeeScript类中使用了d3.js Streamgraph。我已经调整了它,以便在鼠标悬停时,路径的颜色发生变化并出现工具提示。d3.js/CoffeeScript:在mouseover中访问类和路径的执行上下文(this)

现在我想把一些工具提示逻辑提取到一个单独的函数中。

我可以调整执行上下文,以一个或其他,但无法弄清楚如何通过这两个:

class Graph 

    render: -> 
     ... 
     dataArea.enter() 
      .append("path") 
       .on("mouseover", @onMouseOver)   # Option 1 - Pass path context 
       .on("mouseover", @onMouseOver.bind(@)) # Option 2 - Pass class context 

    onMouseOver: (data) -> 
     d3.select(this).attr("class", "") # 1. Depends on path context (to adjust styling) 
     @tooltipHelper(data)    # 2. Depends on class context (which holds helper function) 

    tooltipHelper: (data) -> 
     ... 

以前我从@loganfsmyth一些很大的帮助上一个similar question了解点击事件。这将提示沿着这些方向的答案:

.on("mouseover", (d) => @onMouseOver(d)) 

onMouseOver: (data) -> 
    d3.select(data.target).attr("class", "") 

不幸的是,这似乎并不奏效。因此,另一种表述这个问题的方式可能是“鼠标悬停事件的event.target等同于什么”。

也与@meetamit的this answer相关。它建议通过将this(Graph的实例)分配给在闭包外部声明的变量来实现这一点,但我想这在CoffeeScript中是不可能的,因为这会将所有内容放入闭包中。

你能帮忙吗?

+0

您应该可以访问全局变量'd3.event',如果我理解正确,它应该包含所有需要的信息。 –

+0

@LarsKotthoff,这是完美的。它是我以后的'd3.event.currentTarget'。如果你把它作为答案,我会接受它。 –

+0

完成,谢谢:) –

回答

1

在这种情况下,您可以使用全局变量d3.event来访问所需的所有信息。