2013-09-04 28 views
9

Tôi đang xử lý một số vấn đề phạm vi trong khi sử dụng Coffeescript.var self = this in Coffeescript

drawFirstLine: (currentAngle) -> 
    currentAngle = currentAngle # = 1 

    switch @type 
     # set @endAngle to pick up later on 
     # Math.PI * 2 is the endpoint of a circle divided by seconds times current seconds 
     when "seconds" then @endAngle = Math.PI * 2/60 * @seconds 
     when "minutes" then @endAngle = Math.PI * 2/60 * @minutes 
     when "hours" then @endAngle = Math.PI * 2/24 * @hours 


    @context.arc(@center_x, @center_y, 100, @startAngle, currentAngle, @counterClockWise) 
    @context.lineWidth = 15 

    console.log('drawn') 

    text = "28px sans-serif"; 
    @context.fillText(text, @center_x - 28, @center_y - @canvas.width/5) 

    @context.stroke() 


    currentAngle++; 
    if currentAngle < @endAngle 
     requestAnimationFrame(-> @drawFirstLine(currentAngle/100)) 

Như bạn có thể thấy ở dưới cùng của mã trên, tôi đang cố gắng gọi hàm mà chúng tôi đang ở trong, một lần nữa và một lần nữa. Nhưng vấn đề là tôi không thể sử dụng @drawFirstLine bên trong một hàm khác (hàm requestAnimationFrame). Trong javascript đơn giản, tôi có thể sử dụng var self = this và tự giới thiệu. Nhưng có ai biết làm thế nào để đối phó với điều này trong coffeescript?

Cảm ơn trước,

+0

có thể trùng lặp của [Đối tượng tham chiếu lớp trong một hàm lồng nhau] (http://stackoverflow.com/questions/18281886/trouble-referencing-class-object-inside-a-nested-function) – Mathletics

Trả lời

17

Use the fat arrow.

requestAnimationFrame(=> @drawFirstLine(currentAngle/100)) 

mà biên dịch để:

var _this = this; 

requestAnimationFrame(function() { 
    return _this.drawFirstLine(currentAngle/100); 
}); 

Nó cơ bản hiện self = this cho bạn, làm this hoặc @ bên trong hàm gì this là khi chức năng đó được khai báo. Nó rất tiện dụng, và nó có lẽ là tính năng yêu thích của tôi về coffeescript.

+0

Tuyệt vời, công trình này . Sẽ chấp nhận câu trả lời của bạn càng sớm càng tốt! –

+0

Nhưng bạn sẽ không gặp rắc rối khi sử dụng mũi tên chất béo nếu bạn có một số callbacks sâu? Hoặc nó sẽ luôn luôn đề cập đến ngoài cùng này? – RyanWilcox

+3

@RyanWilcox Nếu bạn tiếp tục sử dụng '=>' khi bạn lồng hàm, 'this' sẽ được duy trì. [Bằng chứng ở đây!] (Http://coffeescript.org/#try:%40foo%20%3D%20'bar'%0A%0Acallback%20%3D%3E%0A%20%20anothercallback%20%3D % 3E% 0A% 20% 20% 20% 20hollaback% 20% 3D% 3E% 0A% 20% 20% 20% 20% 20% 20alert% 20% 40foo) –

1

Tôi làm điều này mọi lúc trong ứng dụng của tôi tại nơi làm việc.

drawFirstLine: (currentAngle) -> 
    currentAngle = currentAngle # = 1 
    self = @ 

    .... 

Hãy nhớ rằng, trong Coffeescript bạn không cần var: điều này sẽ ở lại địa phương với bối cảnh của drawFirstLine chức năng. (nó sẽ tạo ra var self = this).

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