2012-06-07 22 views
9

Tôi đang sử dụng hàm D3 each, chấp nhận chức năng gọi lại và gọi hàm này qua số this làm đối số, nhưng tôi cần truy cập cả this_this. Đây là mã coffeescript:Làm thế nào để sử dụng `this` và` _this` (mũi tên chất béo) bằng cách sử dụng 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)      

và javascript mà nó tạo ra:

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

Làm thế nào tôi có thể nhận được coffeescript sử dụng this thay vì trong dòng này và để lại tất cả mọi thứ cùng ?:

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

Vấn đề là tôi không thể chuyển @x làm đối số cho each và sử dụng mũi tên mỏng thay vì mũi tên chất béo (vì sau đó tôi không thể truy cập s @x), trừ khi tôi viết lại hàm D3, có vẻ quá mức cần thiết.

Trả lời

12

Vì vậy, bạn có cấu trúc này:

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

Nhưng bạn cần getRow là một -> chức năng bình thường để nó trở nên phần tử DOM như @ và bạn cần attr callback là một ràng buộc => chức năng để @x hoạt động, phải không?

Hai khả năng ngay lập tức tôi suy nghĩ:

  1. Sử dụng mẫu CoffeeScript của thường Javascript var that = this; lừa.
  2. Sử dụng hàm có tên được đặt cho cuộc gọi lại attr.

Người đầu tiên trông giống như sau:

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

Thứ hai đi như thế này:

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

Bạn đã cứu tôi. Cảm ơn! – nachocab

+0

Câu trả lời tuyệt vời mu. –

Các vấn đề liên quan