Rails - 从 JavaScript 调用 CoffeeScript

Posted

技术标签:

【中文标题】Rails - 从 JavaScript 调用 CoffeeScript【英文标题】:Rails - Calling CoffeeScript from JavaScript 【发布时间】:2012-03-04 11:38:18 【问题描述】:

我在使用带有 CoffeeScript 的 Rails 3.1 时遇到了问题。如何从 .js.coffee 文件中的 .js.erb 文件调用函数?

说.js.coffee中的函数如下:

myName = -> "Bob"

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

var theName = myName();

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

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

【问题讨论】:

您真的应该接受 Flambino 的回答。太棒了! 【参考方案1】:

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

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

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 设为小写,因为它基本上是一个变量;不是构造函数/类

附录:您可以通过使用-b/--bare 命令行开关来避免使用函数包装器,但如上所述,包装器是个好东西。

【讨论】:

太棒了。非常感谢您的出色回答。期待今晚尝试一下。 天哪,真是一个绝妙的答案:) window.myName的快捷方式:只需写@myName 这是一个很好的答案。阅读更多内容的好资源? @Jeff 很抱歉,我无法指向任何单一资源;命名空间代码和使用 IIFE 避免全局范围污染是基本的 JavaScript 最佳实践,到处都可以找到。 CoffeeScript 只是在编译时遵循它。剩下的只是 JavaScript 和 CoffeeScript 的语法和语义,以及标准的浏览器运行时行为(例如,window 是全局对象)。所以它是“一般客户端开发”的各个方面,但每个方面都有自己的主题。但是一本关于客户端 CoffeeScript(或 Rails,因为这是它经常使用的地方)的书可能会有一些东西。

以上是关于Rails - 从 JavaScript 调用 CoffeeScript的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails:将数据调用到 javascript 中的首选方法?

隐藏 DIV [Rails]

从 Rails 中清理 JSON 的最佳方法

通过javascript在ruby on rails中传递项目ID值

Rails - 将信息从视图传递到 Javascript

Rails 3:将字符串从 Ruby 传递到 Javascript?