2011-05-19 130 views
12

所以在app/assets/javascript/faye.js.coffee.erb我有以下几点:jQuery使用Rails/Coffeescript绑定事件?

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

在它如其他所有代码:sendmessage('room', 'message')工作就好了。而且我可以复制和粘贴上面代码块生成的代码,并将其粘贴到Chrome中,它工作正常。我想这是因为,它是轨道或CoffeeScript的?无论哪种方式,他们中的一个,包装整个文件中:

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

而且会有发生在我一个方法可以被内有定义的访问方法?有没有可能在那里定义一个方法而不分配给一个变量?

+0

我都解释清楚不知道,我只是看到了这个...想喝点咖啡...... – pixelbobby 2011-05-19 14:15:55

+0

这个问题的第二部分基本上是http://stackoverflow.com/questions/5211638/pattern-for-coffeescript-modules的副本/看看我的答案,解释包装的目的。 (尽管在这种情况下,包装并不会引起问题,正如Peter在他的回答中所说的那样)。 – 2011-05-19 15:50:01

回答

28

1)在文档准备就绪之前,很可能您的.bind调用执行得太快,因此它不会执行任何操作。在呼叫包裹,$(document).ready这样

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

而实际上有一个为这个可爱的快捷方式,因为jQuery的默认$功能是$(document).ready的别名,你可以这样做:

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

2)是coffeescript,它将所有内容都包装在一个自我执行的函数定义中。

3)如果你想在CoffeeScript中一个全局函数,明确地将其指定为全局窗口对象

window.myFunc = (arg1) -> 
     alert arg1 

2)& 3的属性)在CoffeeScript docs

+0

来自Coffee Docs关于CoffeeScript的常见注意事项适用 - 您的内联脚本将在封闭包装中运行,所以如果您想要公开全局变量或函数,将它们附加到窗口对象上。“# – 2011-05-19 14:54:37

+0

的确如此,听起来像#1就是这里的答案。你可以通过检查'$('#room_tag')。'来确认。如果它是'1',则在选择时存在该元素;如果它是'0',它不会。 – 2011-05-19 15:53:58