2012-06-07 41 views
9

我正在使用D3函數each,它接受回調函數並調用它作爲參數傳遞this,但我需要同時訪問this_this。這是CoffeeScript的代碼:如何使用`this`和`_this`(胖箭頭)使用coffeescript?

@x = d3.scale.ordinal().domain(d3.range(@model.geneExpressions[0].length)).rangeBands([0, width])  

getRow = (row) => 
    cell = d3.select(this).selectAll(".cell") 
     .data(row) 
     .enter().append("rect") 
     .attr("x", (d,i) => @x(i))  

rows = @heatmap.selectAll(".row") 
    .data(@model.geneExpressions) 
    .enter().append("g") 
    .each(getRow)      

,它生成的JavaScript:

var _this = this;  

this.x = d3.scale.ordinal().domain(d3.range(this.model.geneExpressions[0].length)).rangeBands([0, width]);  

getRow = function(row) { 
     var cell; 
     return cell = d3.select(_this).selectAll(".cell").data(row).enter().append("rect").attr("x", function(d, i) { 
      return _this.x(i); 
     }) 
     };  

rows = this.heatmap.selectAll(".row").data(this.model.geneExpressions).enter().append("g").attr("class", "row").each(getRow); 

我怎樣才能得到的CoffeeScript在此行中使用this來代替,而把一切都相同?:

return cell = d3.select(this) ... 

問題是我無法將@x作爲參數傳遞給each,並使用細箭頭代替胖箭頭(因爲我無法訪問s @x),除非我重寫了D3函數,這看起來過度。

回答

12

所以,你有這樣的結構:

@x = ... 
getRow = (row) => 
    d3.select(@)...attr('x', (d, i) => @x(i)) 
rows = ...each(getRow) 

但你需要getRow是一個正常的->功能,使得它得到的DOM元素爲@和你需要的attr回調是一個綁定=>功能,所以@x作品,對吧?

兩種可能馬上想到:

  1. 使用通常的JavaScript var that = this;絕招CoffeeScript的形式。
  2. attr回叫使用命名的綁定函數。

第一個看起來是這樣的:

that = @ 
getRow = (row) -> 
    cell = d3.select(@) 
     .selectAll(".cell") 
     .data(row) 
     .enter().append("rect") 
     .attr("x", (d,i) -> that.x(i))  

第二是這樣的:

x_at_i = (d, i) => @x(i) 
getRow = (row) -> 
    cell = d3.select(@) 
     .selectAll(".cell") 
     .data(row) 
     .enter().append("rect") 
     .attr("x", x_at_i) 
+0

你救了我。謝謝! – nachocab

+0

很好的答案畝。 –

相關問題