2011-01-12 11 views
19

tengoLa ejecución de una clase CoffeeScript en document.ready

class Main 
    test:-> 
     alert "yay!" 

en CoffeeScript, y quiero que correr dentro de mi index.html

<script> 
    $(function(){ 
     //and obv Main.test(); doesn't work 
    }); 
</script> 

hay una nota de esto en el sitio web , dice que no funcionaría. Pero no pude encontrar cómo hacerlo funcionar. ¿algunas ideas? Necesito averiguar qué envoltura de cierre coffeescript es.

o ¿se ejecuta coffeescript después de document.ready de todos modos?

thx!

+0

La respuesta aquí explica el alcance global con coffeescript muy bien: http : //stackoverflow.com/questions/4214731/coffeescript-global-variables – Marc

Respuesta

24

class Main

Trate class @Main lugar.

obv Main.test(); no funciona

Derecha. Debe ser new Main().test() o Main::test().

¿se ejecuta coffeescript después de document.ready de todos modos?

Suponiendo que lo está ejecutando a través de extras/coffee-script.js y utilizando jQuery, sí.

+3

solo un poco de ayuda para futuros lectores de esta pregunta, si incluye .coffee directamente y compilando con coffee.js, se produce una condición de carrera, y no lo hace no funciona (si compila con CLI, todo está bien) así que para que esto funcione, lo hice: \t \t $ (función() { \t \t \t setTimeout (function() { new Main() }, 1000); \t \t}); Espero eso ayude. – Devrim

9

Coffeescript ajusta su código en una llamada a función para que no pueda sobrescribir accidentalmente las variables globales.

Si desea cualquier variables, funciones o clases que ser global (para que puedan tener acceso a otros archivos), que necesita para hacer explícitamente mundial uniéndolos a this o window.

# Stays within the function scope, so you can't access it outside the file 
myNotGlobalFunction -> return 

# Attaches it to `this` aka `window`, so can be accessed globally 
this.myGlobalFunction -> return 

# A shortcut using @ which is an alias to `this.` 
@myOtherGlobalFunction -> return 

Esto compila a:

(function() { 
    myNotGlobalFunction(function() { 
    return; 
    }); 
    this.myGlobalFunction(function() { 
    return; 
    }); 
    this.myOtherGlobalFunction(function() { 
    return; 
    }); 
}).call(this); 
25

Para ejecutar CoffeeScript después document.ready puede utilizar jQuery así:

$ -> 
    # Put your function code here 
    init() 

Lo que está haciendo es correr jQuery (function() {callback ...}) como la tercera sección en este enlace: http://api.jquery.com/jQuery/

Lo que básicamente dice lo siguiente:

jQuery (devolución de llamada) Devuelve: jQuery Descripción: se une a una función a ejecutar cuando el DOM ha terminado de cargar.

Declaro todas mis clases, etc. fuera del documento listo y luego llamo a una función init para que se ejecute en el momento apropiado.

Espero que ayude!

0

Me he encontrado con este problema antes también.En primer lugar, dado que está definiendo una clase, necesita instanciarla. A continuación, puede llamar a la función test en la instancia:

<script> 
    $(function(){ 
     var an_instance_of_main = new Main(); 
     an_instance_of_main.test(); 
    }); 
</script> 

Sin embargo, es posible que haya notado que el navegador no puede encontrar su clase Main. Esto se debe a que cuando se compila CoffeeScript, envuelve una función autoejecutable alrededor de la definición de su clase para evitar que el acceso al mundo sea Main. Si desea que sea accesible a nivel mundial, se puede prefijar con ventana:

class window.Main 
    test:-> 
     alert "yay!" 

o asignarlo después de definirla:

class Main 
    test:-> 
     alert "yay!" 

window.Main = Main 
Cuestiones relacionadas