2016-06-14 34 views
2

在Rails資產管道中,調用命名函數的正確方法是什麼?在coffeescript中調用命名函數的正確方法是什麼?

例如,在同一個文件中調用一個命名的函數,如下所示,看起來很完美。

#alerts.js.coffee 
show_alert = (msg) -> 
    alert(msg) 

$(document).ajaxComplete (event, request) -> 
    show_alert 'ajax completed' 

但從另一個咖啡文件調用show_alert不起作用

例如與Jquery fileupload

#jquery_fileupload.js.coffee 
jQuery -> 
    $("#container").fileupload 
    stop: (e, data) -> 
     show_alert 'File upload stopped' 

回報Uncaught ReferenceError: show_alert is not defined

毫無疑問,一個基本的問題,但我希望得到一些指點。我不是javascript/coffescript專家,搜索顯示「coffeescript不支持命名函數」,所以我可能使用了錯誤的術語。我應該在這裏引用什麼?

+0

'alert.js.coffee'必須在'jquery_fileupload.js.coffee'之前加載。你在做那個嗎? – Kumar

+0

感謝@KumarAbinash,這很有道理。在部署期間,Rails將單個的coffeescript文件編譯成一個JS文件。有沒有辦法調用不依賴於命令的「命名函數」? –

+1

[「儘管在本文檔中爲了清楚起見而被壓縮,所有的CoffeeScript輸出都被包裝在一個匿名函數中:'(function(){...})()';這個安全包裝器與var關鍵字的自動生成相結合,使得偶然污染全球命名空間變得非常困難。「](http://coffeescript.org/#lexical-scope)。你希望'@show_alert = ...'或'window.show_alert = ...'將其推入全局名稱空間或使用自己的名稱空間。這是重複的,但我的搜索 - 傅今天早上似乎很弱。 –

回答

1

Coffeescript does 函數表達式而不是函數定義。所以你的coffeescript函數應該出現在你的函數執行代碼之前。

一種方法是將您的函數放入一個對象中,並在文檔加載時執行它們。

#alert.js.coffee 
window.MyHelperFunctions = 
    show_alert: (msg) -> 
    alert msg 


#jquery_fileupload.js.coffee 
jQuery -> 
    $("#container").fileupload 
    stop: (e, data) -> 
     MyHelperFunctions.show_alert 'File upload stopped' 
相關問題