Rails应用程序其余部分可用的CoffeeScript/JavaScript类和方法集
我使用的是Rails 3.2.9。当我将CoffeeScript代码添加到Rails应用程序其余部分可用的CoffeeScript/JavaScript类和方法集,javascript,ruby-on-rails,ruby-on-rails-3,coffeescript,ruby-on-rails-3.2,Javascript,Ruby On Rails,Ruby On Rails 3,Coffeescript,Ruby On Rails 3.2,我使用的是Rails 3.2.9。当我将CoffeeScript代码添加到/app/assets/javascripts目录中的.js.coffee文件中时,我会在所有网页中获得生成的JavaScript。问题在于所有JavaScript都包含在以下内容中: (function() { // my code }).call(this); 因此,我定义的任何方法在我在其他文件中编写的任何其他CoffeeScript代码中都不可见。使用Rails编写一组可重用的CoffeeScript类和方法
/app/assets/javascripts
目录中的.js.coffee
文件中时,我会在所有网页中获得生成的JavaScript。问题在于所有JavaScript都包含在以下内容中:
(function() {
// my code
}).call(this);
因此,我定义的任何方法在我在其他文件中编写的任何其他CoffeeScript代码中都不可见。使用Rails编写一组可重用的CoffeeScript类和方法的正确方法是什么?最简单的方法是为所有类命名名称空间。如果您的应用程序被称为“app”,则在发生任何其他情况之前,在初始化代码中:
// Set up the namespace.
window.app = { }
然后在所有.coffee
文件中:
class app.Pancakes
#...
然后,您将拥有一个全局名称空间,并通过该名称空间引用所有内容:
pancakes = new app.Pancakes
类似地,对于简单函数:
app.where_is = (pancakes, house) -> ...
# And elsewhere...
x = app.where_is(...)
有多种设置和部分隐藏命名空间的方法,但它们都是上述方法的变体,简单的命名空间可以很好地与Rails资产管道配合使用。此外,您可以在coffeescript文件中定义如下类:
class this.Person
constructor: (attr = {}) ->
...
这样,定义就附加到全局名称空间。设置名称空间的正确位置在哪里?application.js?布局视图?@at.:任何首先被击中的地方都可以。我不确定它是否能在
application.js
manifest文件中保存,但我想它会的。你甚至可以在其他脚本标记之前将其放入布局中。我在开始时创建了一个带有
的文件,比如\u my\u stuff.js.coffee
。通过这种方式,它是在其他代码之前加载的,我可以在依赖它的其他代码之前设置window.app={}
。这是我一直在搜索的东西。我真的很恼火,因为有了Coffeescript,我用window.name=name
命名了所有东西。我通常在大多数应用程序中使用Rails 4+,所以Coffeescript对我来说是锦上添花,这让我很开心!