17

由于 Meteor 0.6.0 的发布和文件级 JavaScript 变量作用域的添加,我在使用 CoffeeScript 类时遇到了问题,每个类都在各自的文件中定义。

foo.coffee:

class Foo
  ...

subfoo.coffee:

class Subfoo extends Foo
  ...

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

ReferenceError: Foo 未定义

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

4

2 回答 2

25

如文档的 CoffeeScript 部分所述:

全局变量可以通过使用 this(或 CoffeeScript 的 @ 简写)在 CoffeeScript 中设置

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

class @Foo

编译为:

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

假设在您可以执行以下操作foo.coffee之前已加载:subfoo.coffee

class @Subfoo extends Foo

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

@Players = new Meteor.Collection 'players'
于 2013-04-05T11:35:27.753 回答
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即使在 export only 时也能输入foo,您可以foo在顶部展开:

{Foo, Players, doThat} = foo

class Subfoo extends Foo
  ...
于 2013-04-07T10:51:38.063 回答