Rails - Calling CoffeeScript from JavaScript
Rails - Calling CoffeeScript from JavaScript
我在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
命令行开关来避免函数包装器,但如前所述,包装器是一件好事
- Calling VB.Net from Javascript
- AWSELB Cookie access from Javascript
- Routing from Javascript lib in Angular JS 2
- Testing .NET Web API from JavaScript
- ASP.net Identity send AntiForgeryToken from javascript
- URI escape / unescape from Javascript to Perl
- Calling Java Web API from Javascript
- ASMX Web Service from Javascript
- Accessing Amazon RDS from javascript
- writing pdf from javascript/cordova
- Read an MVC @Html.TextBoxFor from Javascript
- SelectOneMenu disable from javascript
- innerHTML from Javascript Array
- Calling Swift from JavaScript
- javascript getElementsByClassName from javascript variable
- Accessing TaublarData from javascript
- Catch the window.open from javascript
- Call python from javascript
- Calling Servlet from JavaScript
- Calling Asp Validator from Javascript