Meteor >0.6.0 和 CoffeeScript 的全局类

Posted

技术标签:

【中文标题】Meteor >0.6.0 和 CoffeeScript 的全局类【英文标题】:Global classes with Meteor >0.6.0 and CoffeeScript 【发布时间】:2013-03-27 16:54:02 【问题描述】:

自从 Meteor 0.6.0 发布并添加了 file-level javascript variable scoping 以来,我在使用 CoffeeScript 类时遇到了问题,每个类都在各自的文件中定义。

foo.coffee:

class Foo
  ...

subfoo.coffee:

class Subfoo extends Foo
  ...

正如预期的那样,由于 Meteor 0.6.0 中引入的更改,我收到以下错误:

ReferenceError: Foo 未定义

这是我的问题:如何使用 CoffeeScript 和 Meteor >0.6.0 处理跨文件的类定义?理想情况下:是否有一种方便的方式修改类的定义方式,以确保这些定义(以及我的应用程序的核心部分)不依赖于 Meteor?

【问题讨论】:

【参考方案1】:

另请注意,诸如“Foo”之类的类本身就是一个值,您可以将其分配给变量或自己放入命名空间中。

当您想将该值直接放入全局命名空间时,使用 class @Foo 是一个很好的捷径。

但如果您愿意,您也可以将变量保留在本地,然后自己将它们添加到全局命名空间中:

class Foo
  ...

Players = new Meteor.Collection 'players'

doThat = -> ...

_.extend(this, Foo, Players, doThat)

或者,如果您愿意,您可以让您的“foo”模块只定义一个包含导出值的全局对象foo

@foo = Foo, Players, doThat

现在使用“foo”模块的模块可以通过全局变量foo引用这些值:

class Subfoo extends foo.Foo
  ...

或者,如果您宁愿只输入Foo,即使只导出foo,您可以在顶部解开foo

Foo, Players, doThat = foo

class Subfoo extends Foo
  ...

【讨论】:

【参考方案2】:

如 docs 的 CoffeeScript 部分所述:

可以在 CoffeeScript 中使用 this 设置全局变量(或 CoffeeScript 的@速记)

事实证明,CoffeeScript 类可以这样定义:

class @Foo

编译为:

this.Foo = (function() 
  function Foo() 
  return Foo;
)();

假设foo.coffeesubfoo.coffee 之前加载,您可以这样做:

class @Subfoo extends Foo

当然,假设需要将Subfoo 分配给全局范围。还值得一提的是,您需要以类似的方式公开您的收藏。例如:

@Players = new Meteor.Collection 'players'

【讨论】:

在尝试实施您的解决方案时,我刚刚意识到 'foo.coffee' 嵌套在我的目录结构中的错误位置,因此 'Foo' 类在 'subfoo.coffee' 中是不可见的,因为Meteor 的加载顺序规则。将 'foo.coffee' 移动到更合适的目录后,使用 'class @ Foo' 和 'class @ Subfoo extends Foo' 有效 [注意:在此注释中插入空格以避免提及]。然而,我仍然有点担心必须编辑我所有的应用程序类,并在所有地方都用“@”前缀类名——但我现在会忍受这个!谢谢 啊,这很有趣。我不知道那是有效的 CoffeeScript。文档中未指定的另一个花絮... 在我使用 js2coffee.org 之前,我并不知道这是有效的 CoffeeScript。我相应地编辑了问题并删除了我自己的(错误和误导性的)提案。我建议编辑您的答案以添加“@Foo 类扩展 Subfoo”解决方案! 是的,我只是重写了整个答案。希望其他人现在可以快速找到他们需要的信息。 请注意,当您设置@Players 时,您仍应将其称为其他地方的玩家。 (因为@Players 在其他功能中不起作用等)

以上是关于Meteor >0.6.0 和 CoffeeScript 的全局类的主要内容,如果未能解决你的问题,请参考以下文章

如何在模板中获取 Meteor.call 函数的结果

为啥 Meteor 抱怨集合的插入方法已经定义?

starbuzz coffee 网页练习

文件方式实现完整的英文词频统计实例

CF1041C Coffee Break

Maven多模块构建实例