2012-02-13 86 views
21

我正在使用Rails 3.1与CoffeeScript并且遇到了一个障碍。如何从位于.js.coffee文件中的.js.erb文件调用函数?Rails - 从JavaScript中调用CoffeeScript

说在.js.coffee功能如下:

myName = -> "Bob" 

我想我可以把它像任何普通的js功能,如:

var theName = myName(); 

但没有按” t似乎工作。有任何想法吗?

或者是否有可能在我的.js.erb文件中使用coffeescript使所有内容都一样?

+2

你应该真的接受Flambino的答案。这很棒! – 2014-04-09 12:37:28

回答

54

您无法直接调用CoffeeScript函数的原因是CoffeeScript在编译时被包装在立即调用的函数中。这样做是为了防止代码污染全局名称空间。

这通常是一个好主意™,但当然您可以在需要的时候避开它。如果你想有一个函数或其他变量进行访问到处(全球范围),你可以简单地说

window.myName = -> "Bob" 

这样一来,该功能直接加入到全球范围内,你可以从叫它任何地方都可以为window.myName()(或简单地作为myName(),除非函数被本地镜像遮蔽)。

然而,保持全局命名空间尽可能干净,最好定义一个命名空间为自己(如jQuery做,通过把一切$对象)。例如,(即要加载的第一个文件)你的第一个的CoffeeScript或JavaScript文件,你可以做这样的事情

window.myNamespace = {}; 

然后,只要你想要的东西是其他地方,你可以将其添加到命名空间:

window.myNamespace.myName = -> "Bob" 

然后你就可以在任何地方调用它,使用window.myNamespace.myName()或者干脆myNamespace.myName()

或者,你可以使用CoffeeScript中的所有文件顶部的“分配,如果未定义或为空”操作符:

window.myNamespace ?= {} # create myNamespace if it doesn't already exist 

无论文件被首先评估将创建缺少window.myNamespace对象。随后的代码将会看到它已经存在并跳过了这个任务。要点是,无论评估顺序如何,它总是可用的。

编辑:制造myNamespace下驼峰,因为它基本上是一个变量;不是构造函数/类

附录:您可以通过使用-b/--bare命令行开关避免了功能的包装,但提到的包装是一件好事。

+0

太棒了。非常感谢这个伟大的答案。期待今晚试用它。 – Brad 2012-02-13 15:21:34

+2

梦幻般的奇妙回答 – Arcolye 2012-02-29 09:47:20

+0

天啊,多么美妙的回答:) – simonmorley 2014-01-16 11:47:35