17

Meteor 0.6.0 のリリースとファイル レベルの JavaScript 変数 scopingの追加以来、 CoffeeScript クラスを使用して問題に直面しており、それぞれが独自のファイルで定義されています。

foo.coffee:

class Foo
  ...

subfoo.coffee:

class Subfoo extends Foo
  ...

予想どおり、Meteor 0.6.0 で導入された変更により、次のエラーが発生します。

ReferenceError: Foo が定義されていません

私の質問は次のとおりです。CoffeeScript と Meteor >0.6.0 を使用するファイル間でクラス定義をどのように処理する必要がありますか? 理想的には、これらの定義 (およびアプリケーションのコア部分) が Meteor に依存しないようにするために、クラスの定義方法をあまり変更しない便利な方法はありますか?

4

2 に答える 2

25

ドキュメントのCoffeeScriptセクションに記載されているように:

これ (または 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'
于 2013-04-05T11:35:27.753 に答える
1

また、「Foo」などのクラスはそれ自体が値であり、変数に割り当てたり、名前空間に自分で配置したりできることに注意してください。

class @Fooその値をグローバル名前空間に直接入れたい場合は、を使用するのが優れたショートカットです。

ただし、必要に応じて、変数をローカルのままにしてから、自分でグローバル名前空間に追加することもできます。

class Foo
  ...

Players = new Meteor.Collection 'players'

doThat = -> ...

_.extend(this, {Foo, Players, doThat})

fooまたは、必要に応じて、「foo」モジュールで、エクスポートされた値を含むグローバル オブジェクトを 1 つだけ定義することもできます。

@foo = {Foo, Players, doThat}

「foo」モジュールを使用するモジュールは、グローバル変数を介して値を参照できるようになりましたfoo

class Subfoo extends foo.Foo
  ...

Fooまたは、エクスポートするときだけでも入力できるようにしたい場合は、上部でfooラップを解除できます。foo

{Foo, Players, doThat} = foo

class Subfoo extends Foo
  ...
于 2013-04-07T10:51:38.063 に答える