使用Meteor的全球类> 0.6.0和CoffeeScript

时间:2013-04-05 10:05:03

标签: coffeescript meteor

自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?

2 个答案:

答案 0 :(得分:25)

正如docs部分所述:

  

可以使用此(或。)在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'

答案 1 :(得分: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
  ...