Meteor全球课程>;0.6.0和CoffeeScript
自从Meteor 0.6.0发布和添加之后,我在使用CoffeeScript类时遇到了一个问题,每个类都在各自的文件中定义 foo.coffee:Meteor全球课程>;0.6.0和CoffeeScript,coffeescript,meteor,Coffeescript,Meteor,自从Meteor 0.6.0发布和添加之后,我在使用CoffeeScript类时遇到了一个问题,每个类都在各自的文件中定义 foo.coffee: class Foo ... class Subfoo extends Foo ... 咖啡: class Foo ... class Subfoo extends Foo ... 正如所料,由于Meteor 0.6.0中引入的更改,我得到以下错误: ReferenceError:未定义Foo 我的问题是:如果CoffeeScr
class Foo
...
class Subfoo extends Foo
...
咖啡:
class Foo
...
class Subfoo extends Foo
...
正如所料,由于Meteor 0.6.0中引入的更改,我得到以下错误:
ReferenceError:未定义Foo
我的问题是:如果CoffeeScript和Meteor>0.6.0,应该如何处理跨文件的类定义?理想情况下:是否有一种方便的方法来避免过多修改类的定义方式,以确保这些定义(以及我的应用程序的核心部分)不依赖于Meteor?如以下内容的CoffeeScript部分所述: 全局变量可以在CoffeeScript中使用此(或 咖啡脚本(速记) 事实证明,CoffeeScript类的定义如下:
class @Foo
其汇编目的是:
this.Foo = (function() {
function Foo() {}
return Foo;
})();
假设foo.coffee
在subfoo.coffee
之前加载,则可以执行以下操作:
class @Subfoo extends Foo
当然,假设需要将subfo
分配给全局范围。同样值得一提的是,您需要以类似的方式公开您的收藏。例如:
@Players = new Meteor.Collection 'players'
还请注意,“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
...
在尝试实现您的解决方案时,我刚刚意识到'foo.coffee'嵌套在我的目录结构中的错误位置,因此'foo'类在'subfo.coffee'中不可见,因为Meteor的加载顺序规则。将“foo.coffee”移动到更合适的目录后,使用“class@foo”和“class@subfo extensed foo”可以工作[注意:此注释中在“@”之后插入空格以避免提及]。然而,我仍然有点担心必须编辑我所有的应用程序类,并在类名的前面加上“@”,但现在我还是要接受它!谢谢,这很有趣。我不知道那是有效的咖啡脚本。还有一个没有在文档中详细说明的小贴士……在我使用js2coffee.org之前,我也不知道这是有效的咖啡脚本。我对问题进行了相应的编辑,删除了我自己的(错误和误导性的)建议。我建议编辑您的答案,同时添加“class@Foo extends subfo”解决方案!是的,我刚刚重写了整个答案。希望其他人现在可以快速找到他们需要的信息。请注意,当您设置
@Players
时,您仍然应该将其称为其他地方的玩家。(因为@Players
在其他功能中无法深入工作,等等)