2016-06-14 78 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' 
相关问题