2013-04-05 37 views
17

自Meteor 0.6.0發佈並增加file-level JavaScript variable scoping以來,我面臨着一個使用CoffeeScript類的問題,每個類都在其各自的文件中定義。Meteor> 0.6.0和CoffeeScript的全球課程

foo.coffee:

class Foo 
    ... 

subfoo.coffee:

class Subfoo extends Foo 
    ... 

正如預期的那樣,因爲在流星0.6.0帶來的變化,我發現了以下錯誤:

ReferenceError: Foo is not defined

這是我的問題:如何處理跨CoffeeScript和Mete文件的類定義或> 0.6.0?理想情況下:爲了確保這些定義(以及我的應用程序的核心部分)不是依賴流星的,有沒有方便的方式來修改定義類的方式太多而非

回答

25

docs的CoffeeScript的部分指出:

class @Foo 

其編譯成:

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

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

事實證明,CoffeeScript的類可以像定義

假設foo.coffee在之前加載你就可以這樣做:

class @Subfoo extends Foo 

假設,當然,Subfoo需求被分配到全球範圍。還值得一提的是,你需要以類似的方式公開你的收藏。例如:

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

當試圖實現您的解決方案,我只是意識到「由於Meteor的加載順序規則,foo.coffee'被嵌套在我的目錄結構中的錯誤位置,因此'Foo'類在'subfoo.coffee'中不可見。將'foo.coffee'移動到更合適的目錄後,使用'class @ Foo'和'class @ Subfoo extends Foo'作爲註釋[注意:在'@'之後的空格中插入空格以避免提及]。不過,我仍然有點擔心必須編輯所有我的應用程序類和前綴類名稱,而且每個地方都帶有'@',但我現在就要忍受這一點!謝謝 – jbmusso 2013-04-05 13:20:10

+0

啊,這很有趣。我不知道這是有效的CoffeeScript。還有另一個沒有在文檔中指定的珍聞... – 2013-04-06 05:46:27

+0

我不知道這是否是有效的CoffeeScript,直到我玩弄js2coffee.org。我相應地編輯了這個問題,並刪除了我自己的(錯誤的和誤導性的)建議。我建議編輯你的答案以添加'class @Foo extends Subfoo'解決方案! – jbmusso 2013-04-06 11:47:53

1

還要注意的是類如「富」本身的值,可以分配給變量或者放入自己的命名空間。

使用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 
    ...