【问题标题】:Global classes with Meteor >0.6.0 and CoffeeScriptMeteor >0.6.0 和 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?

【问题讨论】:

    标签: coffeescript 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.coffeesubfoo.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 在其他功能中不起作用等)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 2015-02-15
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多