2011-05-19 15 views
12

Así que en app/assets/javascript/faye.js.coffee.erb Tengo el siguiente:jQuery vincular eventos con Rails/Coffeescript?

$('#room_tag').bind('blur',() -> 
    alert('Hey!') 
) 

Todo el resto del código en él, tales como: sendmessage('room', 'message') funcionan bien. Y puedo copiar y pegar el código generado desde el bloque de arriba y pegarlo en Chrome. Funciona bien. Supongo que esto se debe a que, es que los carriles o CoffeeScript ?, de cualquier manera uno de ellos, envuelve todo el archivo en:

(function() { 
    // your generated code here 
}).call(this); 

También sería Sucede que hay una manera para que los métodos de acceso que se definen dentro de allí ? ¿Es posible definir un método allí sin asignarlo a una variable?

+0

I no sé, acabo de ver esto y ... quería un café ... – pixelbobby

+0

La segunda parte de esta pregunta es básicamente un duplicado de http://stackoverflow.com/questions/5211638/pattern-for-coffeescript-modules/Vea mi respuesta allí, explicando el propósito del contenedor. (Aunque en este caso, el contenedor no está causando el problema, como dice Peter en su respuesta.) –

Respuesta

28

1) Lo más probable es que su llamada .bind se esté ejecutando demasiado pronto, antes de que el documento esté listo y por lo tanto no haga nada. Envolverlo en una llamada a $(document).ready como esto

$(document).ready -> 
     $('#room_tag').bind 'blur', -> 
     alert 'Hey!' 

Y de hecho hay un acceso directo lindo para esto, ya que la función por defecto $ de jQuery es un alias para $(document).ready, sólo puede hacer:

$ -> 
    $('#room_tag').bind 'blur', -> 
    alert 'Hey!' 

2) Se es coffeescript que envuelve todo en una definición de función autoejecutable.

3) Si desea realizar una función global en CoffeeScript, explícitamente asignarlo como una propiedad de la ventana de objeto global

window.myFunc = (arg1) -> 
     alert arg1 

2) & 3) se explican claramente en el CoffeeScript docs

+0

de Coffee Docs: se aplican las advertencias habituales sobre CoffeeScript: los scripts en línea se ejecutarán dentro de un contenedor de cierre, por lo que si lo desea para exponer variables globales o funciones, adjúntelas al objeto ventana. –

+0

Exactamente, suena como # 1 es la respuesta aquí. Puede confirmar esto marcando '$ ('# room_tag'). Length'. Si es '1', el elemento existe en el momento de la selección; si es '0', no es así. –

Cuestiones relacionadas