我正处于尝试编写一些明智的 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/