【问题标题】:Application Scope in coffeescriptcoffeescript中的应用范围
【发布时间】:2013-02-07 06:24:14
【问题描述】:

我正在使用coffeescript 开发一个Web 应用程序。

  • 我将所有类都放在单独的文件中。
  • 这些类引用了几个全局常量(声明为我的应用程序)。

我想从另一个文件 main.coffee 创建这些对象的实例。

我怎样才能拥有应用范围内的类和常量?

【问题讨论】:

  • 您应该发布一些示例来展示您的代码的结构。
  • 是的,同意@AlexWayne。我发布了一个答案,但现在我看到这个问题被标记为requirejs,如果你正在使用一个工具来管理这样的依赖关系,那么命名空间突然就没有太大意义了;你可以只使用局部变量,这太棒了 =D

标签: coffeescript


【解决方案1】:

您需要使用--bare 选项编译所有文件,这使您的所有类都可以通过“全局”范围(浏览器环境中的window 变量)使用,或者您可以定义自己的@987654323 @ 并明确地使您的课程可用,例如:

class MyClass
   ...

window.MyNamespace.MyClass = MyClass

你已经标记了你的帖子requirejs,我相信它比我对你的问题提出的任何一个建议都有更好的解决方案来构建你的模块,其中每个模块实例都被明确传递,但 requirejs 是一个整体自己的话题。

【讨论】:

  • 对不起,我已经删除了 requirejs 标签。我现在正在研究 requirejs 选项。将为此发布一个单独的问题。
【解决方案2】:

我注意到 100% 了解 amd 的工作原理,但尽管有 MyNamespace 和使用 --bare 编译的选项,您可以在使用 coffeescript 编译器编译之前将文件合并为一个“大”文件。

【讨论】:

  • --bare 我猜不是一个好习惯。我想避免这种情况。
【解决方案3】:

其他答案建议这样做,但您可能不想使用 --bare 进行编译,因为它会使文件中的 all 顶级声明成为全局:不仅是类,而且还有辅助函数、常量和仅在该文件中使用的东西,您可能不想放入全局命名空间。

最好明确并使用class window.MyClass,这会将那个类放在全局命名空间中。

或者更好的是,如果您的应用程序有一个命名空间,例如,在您声明的文件中:

# Namespace for application stuff.
window.App = {}

然后您可以通过以下方式将类放入该命名空间:

# In another file; make sure the first file gets executed before so `App` exists.
class App.MyClass

然后您可以通过引用它(包括其命名空间)从任何地方实例化和使用该类:

c = new App.MyClass
c.someMethod()

【讨论】:

  • 问题是我的类使用在 main.coffee 中声明的应用程序常量。所以我不确定首先加载哪些文件。拥有一个只有应用程序常量的文件看起来不是一个好选择。
  • @AkshayAurora 看起来像是某种循环依赖问题。 JS 有这些问题,尤其是考虑到文件被执行(毕竟它们是脚本)。我建议您花点时间清楚地识别依赖关系,然后根据这些依赖关系布置类/模块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 2014-08-29
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多