Rails - Calling CoffeeScript from JavaScript

Rails - Calling CoffeeScript from JavaScript

本文关键字:from JavaScript CoffeeScript Calling Rails      更新时间:2023-09-26

我在CoffeeScript中使用Rails 3.1,遇到了一个问题。如何从位于.js.coffee文件中的.js.erb文件中调用函数?

假设.js.coffee中的函数如下:

myName = -> "Bob"

我想我可以像任何常规的js函数一样调用它,比如:

var theName = myName();

但这似乎不起作用。有什么想法吗?

或者可以在我的.js.erb文件中使用coffeescript来使所有内容都一样吗?

不能直接调用CoffeeScript函数的原因是,编译时CoffeeSript被封装在一个立即调用的函数中。这样做是为了防止代码污染全局命名空间。

这通常是个好主意™,当然,你可以在需要的时候绕过它。如果你想让一个函数或其他变量在的任何地方都可以访问(即全局范围),你可以简单地说

window.myName = -> "Bob"

通过这种方式,函数被直接添加到全局作用域,您可以从任何位置将其调用为window.myName()(或者简单地调用为myName(),除非函数被本地作用域遮蔽)。

然而,为了保持全局命名空间尽可能干净,最好为自己定义一个命名空间(就像jQuery所做的那样,将everything放入$对象中)。例如,在您的第一个CoffeeScript或JavaScript文件(即要加载的第一个文件)中,您可以执行类似以下的操作

window.myNamespace = {};

然后,只要你想在其他地方获得一些东西,你就可以把它添加到这个名称空间:

window.myNamespace.myName = -> "Bob"

然后您可以在任何地方调用它,使用window.myNamespace.myName()或简单地使用myNamespace.myName()

或者,您可以在所有文件的顶部使用CoffeeScript的"assign if undefined or null"操作符:

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

无论哪个文件首先得到评估,都将创建丢失的window.myNamespace对象。随后的代码只会看到它已经存在,并跳过赋值。重点是,无论评估顺序如何,它都将始终可用。

编辑:使myNamespace的camelcase更低,因为它基本上是一个变量;不是构造函数/类

附录:您可以通过使用-b/--bare命令行开关来避免函数包装器,但如前所述,包装器是一件好事