d3.js CoffeeScript类执行上下文

d3.js CoffeeScript类执行上下文,coffeescript,d3.js,Coffeescript,D3.js,我正在使用CoffeeScript类创建一个d3.js图表。我想将一个方法附加到单击事件,然后根据单击的内容运行另一个方法: class @Chart drawChart: -> ... dataArea .enter() .append("path") .on("click", @onClick); ... onClick: -> if d3.select(this).attr("ty

我正在使用CoffeeScript类创建一个d3.js图表。我想将一个方法附加到单击事件,然后根据单击的内容运行另一个方法:

class @Chart

  drawChart: ->
     ...

    dataArea
      .enter()
        .append("path")
          .on("click", @onClick);
     ...

  onClick: ->
    if d3.select(this).attr("type") == 'video'
      @runVideo(d3.select(this).attr("title"))

  runVideo: ->

问题是,在onClick方法中,执行上下文(“this”)是选择,而不是图表类,因此“runVideo不是函数”。如何从onClick方法中访问选择属性并同时运行runVideo方法

您要做的是在添加click回调时以某种方式捕获

您在这里有几个选项:

// The Coffeescript way:
.on("click", (args...) => @onClick(args...));

// The jQuery way:
.on("click", $.proxy(@onClick, @))

// The ECMAscript5 way:
.on("click", @onClick.bind(@))
然后,您需要将您的
onClick
修改为:

onClick: (evt) ->
  if d3.select(evt.target).attr("type") == 'video'
    @runVideo(d3.select(evt.target).attr("title"))