2011-08-07 51 views
4

我最近開始閱讀有關CoffeeScript http://jashkenas.github.com/coffee-script/,它看起來非常神奇!然而,我似乎無法弄清楚是否有一種簡單的方法來訪問/使用外部JavaScript API。我廣泛使用OpenLayers,所以有人可以告訴我如何在CoffeeScript中編寫下面的代碼片段?CoffeeScript與其他庫

var map = new OpenLayers.Map('map_div', { 
    controls: [ 
     new OpenLayers.Control.PanZoomBar(), 
     new OpenLayers.Control.LayerSwitcher({'ascending':false}) 
    ], 
    numZoomLevels: 6  
}); 

回答

2

你有多少語法使用一點靈活性,但這是我怎麼會寫:

map = new OpenLayers.Map 'map_div', 
    controls: [ 
     new OpenLayers.Control.PanZoomBar(), 
     new OpenLayers.Control.LayerSwitcher ascending: false 
    ] 
    numZoomLevels: 6 

這編譯成

var map; 
map = new OpenLayers.Map('map_div', { 
    controls: [ 
    new OpenLayers.Control.PanZoomBar(), new OpenLayers.Control.LayerSwitcher({ 
     ascending: false 
    }) 
    ], 
    numZoomLevels: 6 
}); 

基本上是與您的JavaScript代碼相同。

+0

太棒了!我不敢相信我現在只是找到這些東西。 –

3

有一點需要注意的是,OpenLayers中的對象系統使用一個名爲initialize()的函數作爲構造函數,所以爲了在擴展OpenLayers類時讓CoffeeScript的超級關鍵字正確工作,您需要裝飾它們。我用下面的功能是:

window.CompatibleClass = (cls) -> 
    class Wrapped 
    constructor: -> 
     # Call the OpenLayers-style constructor. 
     cls::initialize.apply @, arguments 

    # Copy prototype elements from OpenLayers class. 
    Wrapped::[name] = el for name, el of cls:: 

    Wrapped 

現在,您可以擴展內置像這樣的OL:

class MySpecialFeature extends (CompatibleClass OpenLayers.Feature.Vector) 
    constructor: -> 
    super new OpenLayers.Geometry.Point 0, 0 

    CLASS_NAME: "MySpecialFeature" 

編輯:只是爲了澄清,這兩個替代包裝類像這樣就是按原樣使用OpenLayers類系統,並且錯過了CoffeeScript的一些語法優點,或者在每個構造函數中手動調用初始化函數,這會感覺更脆弱,並圍繞依賴進行傳播,而不是集中它在一個裝飾器中。

使用的OpenLayers類系統原樣,在CoffeeScript的:

MySpecialFeature = OpenLayers.Class OpenLayers.Feature.Vector, 
    initialize: -> 
     # Call super using apply, as is convention in OpenLayers 
     OpenLayers.Feature::initialize.apply @, new OpenLayers.Geometry.Point 0, 0 
     ... 
    ... 

或者,使用的CoffeeScript類,但延伸的的OpenLayers類未飾:

class MySpecialFeature extends OpenLayers.Feature.Vector 
    constructor: -> 
     # Call inherited initialize(). 
     @initialize.apply @, new OpenLayers.Geometry.Point 0, 0 
     ... 
    ... 

這些方法都不將與其他開發者一樣習慣或認可,無論是OpenLayers還是CoffeeScript。我支持我的一個包裝的建議,它允許本地super()用於調用OpenLayers構造函數。

+0

我似乎在增加不必要的複雜性和開銷(迭代兩次?)。此外,OL api /源代碼隨時可能會隨時更改,破壞您的代碼。恕我直言,OL建立在繼承系統是完全正常的,沒有理由將其抽象出來。 –

+1

我不同意。我編輯了我的答案,以幫助更好地解釋這種方法在兩種方法上的好處。 – mikepurvis

+0

我不是說你的看起來不太好。它的語義和優雅。然而,當你開始擴展像OL這樣的庫時,我發現堅持使用慣例可以在以後節省很多頭痛。像這樣的糖可能會引入更多「陷阱」 –