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 中的首选方法?