2012-07-07 12 views
5
class Game 

    foo: null 

    play: -> 

    @foo = 2 
    @animate() 

    animate: -> 

    requestAnimationFrame(@animate, 1000) 
    console.log('foo = ', @foo) 


$ -> 
    game = null 

    init = -> 

    game = new Game() 
    game.play() 

    init() 

Il registro nel metodo animato nel gioco produce:variabile istanza diventa undefined - CoffeeScript

foo = 2

foo = undefined

Quindi foo è 2 in prima convocazione per animare e quindi indefinito da allora in poi. Qualcuno potrebbe spiegare perché e come posso risolvere questo problema. Ogni aiuto è molto apprezzato.

+0

'requestAnimationFrame' non accetta un numero come secondo argomento; al contrario, chiama la funzione data ASAP (in genere più veloce di 'setTimeout (func, 0)' fa) a condizione che la scheda del browser sia in primo piano. Vedi https://developer.mozilla.org/en/DOM/window.requestAnimationFrame –

risposta

11

Quando si chiama setInterval, il contesto viene perso e la seconda volta @ è window. Hai bisogno di metodi di grasso-freccia per mantenere l'appropriata this:

animate: => 
+0

Grazie per la risposta. Questo ha funzionato, ma ha causato un comportamento molto strano con requestAnimationFrame. Sto chiamando requestAnimationFrame come dovrebbe essere fatto, ma con la fat fat è ripetendo la chiamata sull'altra call a requestAnimationFrame. –

+0

@ user881920 Questa ripetizione è il comportamento corretto. Dovresti accettare la risposta di Aaron. Se hai un problema con 'requestAnimationFrame', dovresti fare una domanda a parte. –

+0

Grazie per questa risposta. Semplice e chiaro – Glenn

5

È possibile definire animate come segue:

animate: -> 
    callback = (=> @animate()) 
    requestAnimationFrame(callback, 1000) 
    console.log('foo = ', @foo) 

La tecnica qui è quello di ottenere un metodo vincolato. @animate di per sé è non associato, ma (=> @animate()) è la versione associata di esso.

È possibile ottenere un risultato simile se si sta utilizzando UnderscoreJS come segue:

animate: -> 
    callback = _.bind(@animate, @) 
    requestAnimationFrame(callback, 1000) 
    console.log('foo = ', @foo) 

E se si utilizza una versione successiva di JavaScript, si può essere in grado di fare come segue:

animate: -> 
    callback = @animate.bind(@) 
    requestAnimationFrame(callback, 1000) 
    console.log('foo = ', @foo) 
Problemi correlati