2013-09-04 9 views
9

Ich habe mit einigen Umfang Probleme bei der Verwendung von Coffeescript.var self = das 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)) 

Wie Sie am unteren Rand des obigen Code sehen kann ich die Funktion aufrufen, ich versuche, wo wir sind, wieder und wieder. Aber das Problem ist, dass ich @drawFirstLine innerhalb einer anderen Funktion (die Funktion requestAnimationFrame) nicht verwenden kann. In einfachem Javascript kann ich var self = this verwenden und auf self verweisen. Aber weiß jemand im Coffeescript, wie man damit umgeht?

Vielen Dank im Voraus,

+0

möglich duplicate von [Problem, das Klassenobjekt in einer verschachtelten Funktion referenziert] (http://stackoverflow.com/questions/18281886/trouble-referencing-class-object-inside-a-nested-function) – Mathletics

Antwort

17

Use the fat arrow.

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

, die kompiliert: Es besteht im Wesentlichen

var _this = this; 

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

tut das self = this für Sie, this oder @ innerhalb der Funktion zu machen, was this ist, wenn Diese Funktion wird deklariert. Es ist sehr praktisch, und es ist wahrscheinlich mein Lieblingsfeature von coffeescript.

+0

Großartig, das funktioniert . Wird Ihre Antwort so bald wie möglich akzeptieren! –

+0

Aber wirst du nicht immer in Schwierigkeiten geraten, wenn du den dicken Pfeil benutzt, wenn du mehrere Callbacks tief hast? Oder wird es sich immer auf das Äußerste beziehen? – RyanWilcox

+3

@RyanWilcox Wenn Sie weiterhin '=>' verwenden, während Sie Funktionen verschachteln, wird 'this 'beibehalten. [Der Beweis ist hier!] (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

Ich mache dies die ganze Zeit in meiner App bei der Arbeit.

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

    .... 

Denken Sie daran, in Coffeescript Sie var nicht brauchen: dies wird in den Kontext der drawFirstLine Funktion lokal bleiben. (es erzeugt var self = this).