2011-05-19 128 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