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.coffee
在subfoo.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 的全局类的主要内容,如果未能解决你的问题,请参考以下文章