2013-09-04 11 views
9

Ho a che fare con alcuni problemi di ambito durante l'utilizzo di Coffeescript.var auto = questo 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)) 

Come si può vedere nella parte inferiore del codice di cui sopra che sto cercando di chiamare la funzione in cui ci troviamo, ancora e ancora. Ma il problema è che non posso usare @drawFirstLine all'interno di un'altra funzione (la funzione requestAnimationFrame). In plain javascript posso usare var self = this e fare riferimento a self. Ma qualcuno sa come affrontare questo in coffeescript?

Grazie in anticipo,

+0

possibile duplicato di [Trouble referencing oggetto di classe all'interno di una funzione nidificata] (http://stackoverflow.com/questions/18281886/trouble-referencing-class-object-inside-a-nested-function) – Mathletics

risposta

17

Use the fat arrow.

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

che compila a:

var _this = this; 

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

'fondamentalmente fa il self = this per voi, facendo this o @ all'interno della funzione quello this è quando quella funzione è dichiarata. È molto utile, ed è probabilmente la mia caratteristica preferita del coffeescript.

+0

Grande, questo funziona . Accetterà la tua risposta al più presto! –

+0

Ma non ti troverai ancora nei guai quando usi la freccia grossa se ti piacciono diverse chiamate di callback? O si riferirà sempre al più esterno? – RyanWilcox

+3

@RyanWilcox Se si continua a usare '=>' mentre si annidano le funzioni, 'this' verrà mantenuto. [La prova è qui!] (Http://coffeescript.org/#try:%40foo%20%3D%20'bar'%0A%0Acallback%20%3D%3E%0A%20%20anothercallback%20%3D % 3E% 0A% 20% 20% 20% 20% 20hollaback% 3D% 3E% 0A% 20% 20% 20% 20% 20% 20% 20alert% 40foo) –

1

Lo faccio sempre nella mia app al lavoro.

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

    .... 

Ricordate, in CoffeeScript non è necessario var: questo rimarrà locale al contesto della funzione drawFirstLine. (genererà var self = this).

Problemi correlati