javascript - Rails - 从 JavaScript 调用 CoffeeScript

标签 javascript ruby-on-rails coffeescript

我正在使用 Rails 3.1 和 CoffeeScript,但遇到了障碍。如何从位于 .js.coffee 文件中的 .js.erb 文件调用函数?

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

myName = -> "Bob"

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

var theName = myName();

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

或者是否可以在我的 .js.erb 文件中使用 Coffeescript 使所有内容都相同?

最佳答案

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

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

window.myName = -> "Bob"

这样,该函数将直接添加到全局作用域,您可以从任何地方以 window.myName() 形式调用它(或简单地以 myName() 形式调用)除非该函数被本地函数遮蔽)。

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

window.myNamespace = {};

然后,每当您希望某些内容在其他地方可用时,您可以将其添加到该命名空间:

window.myNamespace.myName = -> "Bob"

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

或者,您可以在所有文件的顶部使用 CoffeeScript 的“如果未定义或 null 则赋值”运算符:

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

无论哪个文件首先被评估,都会创建缺少的 window.myNamespace 对象。后续代码只会看到它已经存在并跳过分配。要点是,无论评估顺序如何,它始终可用。

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

附录:您可以使用 -b/--bare 命令行开关来避免使用函数包装器,但正如前面提到的,包装器是一件好事。 p>

关于javascript - Rails - 从 JavaScript 调用 CoffeeScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9254253/

相关文章:

ruby-on-rails - 如何在 Heroku 上获得完整的堆栈跟踪

jquery - 更新 meteor 模板后运行函数

JavaScript/Coffeescript 求和对象

php - 在 $.ajax 函数中使用 JS 变量 - null?

ruby-on-rails - Rails 3,什么是最好的行为树行为?

ruby-on-rails - 在Rails中缓存Twitter API调用

node.js - CoffeeScript + ionic

javascript - 开始日期结束日期列上的 JSON Linq.js 过滤器

javascript - 是否可以一次为元素的所有事件分配阻止默认值?

javascript - react -Redux; .map 函数有时会重复数组