ruby-on-rails - 您如何在 Rails 3.1 中使用 Sprockets 编写干燥的模块化 CoffeeScript ?

标签 ruby-on-rails coffeescript ruby-on-rails-3.1 sprockets javascript-namespaces

我正处于尝试编写一些明智的 Javascript 的早期阶段。我想基本上以我的应用程序名称命名所有内容,以尽可能避免全局变量,但仍然给我一种访问在该位置周围声明的函数的方法。但是,我不想在函数定义中过于冗长。

我理想的 CoffeeScript 应该是这样的:

class @MyApp
  @myClassMethod = ->
    console.log 'This is MyApp.myClassMethod()'

  class @Module1
    @moduleMethod = ->
      console.log 'This is MyApp.Module1.moduleMethod()'

你得到图片。这样我就不必写 MyApp.Module.submoduleMethod = ->每次我想正确定义命名空间函数时 - 使用 @并在我的类定义中定义事物使事情变得美好而简短。

这一切都很顺利,直到我想将我的功能拆分为多个 CoffeeScript 文件。那么我真正想要的是这样的:
// application.js
class @MyApp
  //= require 'module1'
  //= require 'module2'

// module1.js
class @Module1
  @moduleMethod = ->
    console.log 'This is STILL MyApp.Module1.moduleMethod()'

Sprockets 似乎无法做到这一点。

有没有一种明智的方法来要求我的 CoffeeScript 文件在我的容器文件中的正确位置?或者使用 CoffeeScript、Sprockets 和 Rails 3.1 编写模块化代码的另一种方法?

最佳答案

只需保持 module1.js 原样并使 application.js 看起来像这样:

//= require 'module1'

class @MyApp
  ...

  @Module1 = Module1

这将起作用,因为您已经制作了 Module1一个全局变量(声明 class @Module1 等价于编写 @Module1 = class Module1 ,并且 @ 在该上下文中指向 window),并且在 class @MyApp 内 body , @指向类本身。

如果你想要Module1仅是全局 MyApp 的属性附加后的类,您可以添加该行
delete window.Module1

关于ruby-on-rails - 您如何在 Rails 3.1 中使用 Sprockets 编写干燥的模块化 CoffeeScript ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6815957/

相关文章:

CoffeeScript 检查是否不在数组中

ruby - Ruby 1.9.2 中机架级别的 SystemStackError,而不是 1.8.7

ruby-on-rails - 如何根据 rails 3.1 中的通配符子域向 sprockets 添加 Assets 搜索路径?

mysql - Rails应用程序MYSQL错误nginx

ruby-on-rails - react /巴别塔 : Components not rendering only on CircleCI

ruby-on-rails - Omniauth linkedin gem 不再在 Rails 应用程序上提取完整配置文件

ruby-on-rails - 通过heroku上的sidekiq导入csv的file.path问题

node.js - 将 meteor 与 CoffeeScript 和 Jade 一起使用 : callback[i]. 调用不是函数

jquery - 为什么这个函数调用不能使用 Coffeescript 工作?

ruby-on-rails - 在 IRB 中使用 Yahoo Fantasy Sports API