Подтвердить что ты не робот

Глобальные классы с Meteor> 0.6.0 и CoffeeScript

С момента выпуска Meteor 0.6.0 и добавления степени масштабирования JavaScript на уровне файла, я столкнулся с проблемой, используя классы CoffeeScript, каждый из которых определяется в соответствующем файле.

foo.coffee:

class Foo
  ...

subfoo.coffee:

class Subfoo extends Foo
  ...

Как и ожидалось, и из-за изменений, внесенных в Meteor 0.6.0, я получаю следующую ошибку:

ReferenceError: Foo не определен

Вот мой вопрос: как следует обрабатывать определения классов в файлах с CoffeeScript и Meteor > 0.6.0? В идеале: есть ли удобный способ не слишком сильно изменять способ определения классов, чтобы убедиться, что эти определения (и основные части моего приложения) не зависят от Метеор?

4b9b3361

Ответ 1

Как отмечено в разделе CoffeeScript 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'

Ответ 2

Также обратите внимание, что классы, такие как "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
  ...