2013-04-05 17 views
17

ile küresel sınıflar Meteor 0.6.0 sürümü ve file-level JavaScript variable scoping eklendiğinden beri, her biri kendi dosyasında tanımlanmış olan CoffeeScript sınıflarını kullanarak bir sorunla karşı karşıyayım.Meteor> 0.6.0 ve CoffeeScript

foo.coffee:

class Foo 
    ... 

subfoo.coffee:

class Subfoo extends Foo 
    ... 
Beklendiği gibi

, çünkü Meteor 0.6.0 tanıtılan değişikliklerin, aşağıdaki hatayı alıyorum:

ReferenceError: Foo is not defined

İşte sorum şu: CoffeeScript ve Mete ile dosyalarda sınıf tanımlarını nasıl ele almalı? veya> 0.6.0? İdeal: 'un, bu tanımların (ve uygulamamın çekirdek kısımlarının) Meteor'a bağlı olmadığından emin olmak için sınıfların tanımlanma şeklini çok fazla değiştirmek için uygun bir yol var mı? docs arasında CoffeeScript bölümünde belirtildiği gibi

cevap

25

:

this.Foo = (function() { 
    function Foo() {} 
    return Foo; 
})(); 
: derler

class @Foo 

:

Global variables can be set in CoffeeScript by using this (or CoffeeScript's @ shorthand)

Görünen o ki, CoffeeScript sınıfları gibi tanımlanabilir

foo.coffee'un'den önce yüklendiğini varsayarsaksonra yapabilirsiniz:

class @Subfoo extends Foo 

Subfoo ihtiyaçları küresel kapsamı atanacak olması, tabii ki, varsayarsak. Ayrıca, koleksiyonlarınızı benzer bir şekilde sergilemeniz gerekeceğini de belirtmek gerekir. Örneğin:

@Players = new Meteor.Collection 'players' 
+0

çözümünüzü uygulamaya çalışırken, fark ettim 'olduğunu foo.coffee 'dizin yapısındaki yanlış yere yerleştirildi ve Meteo'nun yükleme emri kuralları nedeniyle' subfoo.coffee 'içinde' Foo 'sınıfı görünmezdi. 'Foo.coffee' öğesini daha uygun bir dizine taşıdıktan sonra, 'class @ Foo' ve 'class @ Subfoo Foo' çalışmalarını kullanır [not: '@' den sonra bu yoruma eklenen boşluklar). Bununla birlikte, tüm uygulama sınıflarımı ve önek sınıfı adlarını her yerde '@' ile düzenlemek zorunda kaldığım için hala biraz endişeliyim - ancak şimdilik bununla yaşayacağım! Teşekkür – jbmusso

+0

Ah bu ilginç. Bunun geçerli bir CoffeeScript olduğunu bilmiyordum. Dokümanlar içinde belirtilmemiş başka bir tidbit ... –

+0

Ben js2coffee.org ile oynadı kadar ya geçerli bir CoffeeScript olduğunu bilmiyordum. Soruyu buna göre düzenledim ve kendi (hatalı ve yanıltıcı) teklifimi kaldırdım. 'Class @Foo extends Subfoo' çözümünü eklemek için cevabınızı düzenlemenizi öneririm! – jbmusso

1

Ayrıca değişkenlere atamak veya bir ad kendiniz koymak olabilir, örneğin "Foo" olarak sınıflar bir değer kendileri olduğunu unutmayın.

Bu değeri doğrudan global ad alanına koymak istediğinizde class @Foo kullanmak harika bir kısayoldur.Eğer, aynı zamanda yerel değişkenler bırakın ve daha sonra genel ad kendiniz ekleyebilirsiniz isterseniz

Ama:

class Foo 
    ... 

Players = new Meteor.Collection 'players' 

doThat = -> ... 

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

Yoksa tercih ederseniz, size "foo" modülü olabilir sadece tanımlamak

: global değişken foo aracılığıyla değer başvurabilir "foo" modülü kullanmak

Şimdi
@foo = {Foo, Players, doThat} 

modülleri: ihraç değerleri içeren bir küresel nesne foo Bunun yerine sadece foo dışa aktarırken sadece Foo bile, en üstteki foo paketini yapabilirsiniz yazmanız mümkün olurdu eğer

class Subfoo extends foo.Foo 
    ... 

Veya:

{Foo, Players, doThat} = foo 

class Subfoo extends Foo 
    ...