一组可供 Rails 应用程序使用的 CoffeeScript/JavaScript 类和方法
Posted
技术标签:
【中文标题】一组可供 Rails 应用程序使用的 CoffeeScript/JavaScript 类和方法【英文标题】:Set of CoffeeScript/JavaScript classes and methods available to rest of Rails app 【发布时间】:2012-11-03 18:23:45 【问题描述】:我使用的是 Rails 3.2.9。当我将 CoffeeScript 代码添加到 /app/assets/javascripts
目录中的 .js.coffee
文件时,我在所有网页中都得到了生成的 JavaScript。问题是所有的 JavaScript 都包含在:
(function()
// my code
).call(this);
所以我定义的任何方法在我在其他文件中编写的任何其他 CoffeeScript 代码中都不可见。用 Rails 编写一组可重用的 CoffeeScript 类和方法的正确方法是什么?
【问题讨论】:
【参考方案1】:最简单的做法是命名所有类。如果您的应用程序被称为“应用程序”,那么在发生其他任何事情之前在您的初始化代码中:
// 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 资产管道很好地配合。
【讨论】:
在哪里设置命名空间的正确位置?应用程序.js?布局视图? @at.: 先被击中的任何地方都可以。我不确定它是否会在application.js
清单文件中存在,但我猜它会。你甚至可以在你的脚本标签的其余部分之前把它放在你的布局中。
我创建了一个以_
开头的文件,例如_my_stuff.js.coffee
。这样它会在其他所有内容之前加载,我可以在依赖它的其他代码之前设置window.app =
。【参考方案2】:
此外,您可以像这样在 coffeescript 文件中定义类:
class this.Person
constructor: (attr = ) ->
...
通过这种方式,定义被附加到全局命名空间。
【讨论】:
这是我一直在寻找的东西。我真的很生气,因为使用 Coffeescript 我用window.name = name
命名所有东西。我通常在大多数应用程序中使用 Rails 4+,所以 Coffeescript 对我来说主要是锦上添花,这让我很开心!以上是关于一组可供 Rails 应用程序使用的 CoffeeScript/JavaScript 类和方法的主要内容,如果未能解决你的问题,请参考以下文章
Rails 路径助手在 js.coffee.erb 中不起作用
为啥 rails 对咖啡脚本文件使用 .js.coffee 扩展名,因为它们无论如何都不能包含 JavaScript 代码?
我得到“您的要求无法解决为一组可安装的软件包。”当我运行作曲家更新