【问题标题】:Set of CoffeeScript/JavaScript classes and methods available to rest of Rails app一组可供 Rails 应用程序使用的 CoffeeScript/JavaScript 类和方法
【发布时间】: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 类和方法的正确方法是什么?

【问题讨论】:

    标签: javascript ruby-on-rails ruby-on-rails-3 coffeescript ruby-on-rails-3.2


    【解决方案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 对我来说主要是锦上添花,这让我很开心!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 2015-04-06
    • 2013-06-28
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    相关资源
    最近更新 更多