自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?
答案 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
...