2011-08-07 5 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

awesome!私は今、この物を見つけているとは信じられません。 –

3

OpenLayersのオブジェクトシステムでは、initialize()という関数をコンストラクタとして使用しているため、OpenLayersクラスを拡張するときにCoffeeScriptのsuperキーワードを正しく動作させるには、それらを飾る。私はこのために次の関数を使用します。

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" 

EDIT:ちょうどクラスをラップする、二つの選択肢を明確にしますOpenLayersクラスのシステムをそのまま使用し、CoffeeScriptの構文上の利点のいくつかを見逃したり、各コンストラクタで手作業でinitialize関数を呼び出すことがあります。これは、より脆く感じて、依存性の周囲に広がりますそれは単一のデコレータで。

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をクラス未装飾延びる:のCoffeeScriptで、そのままOpenLayersをクラスシステムを使用

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

をこれらの方法のいずれも意志OpenLayersまたはCoffeeScriptのいずれかの他の開発者には、慣用的または認識可能である必要があります。私は、OpenLayersコンストラクタを呼び出す際にネイティブのsuper()を使用できるようにするラッパーを推奨しています。

+0

不要な複雑さとオーバーヘッドを追加しているようです(2回繰り返します)。また、OL API /ソースはいつでもあなたのコードを破壊する可能性があります。 IMHOは、継承システムで構築されたOLは完全に正常であり、抽象化する理由はありません。 –

+1

私は同意しません。私は2つの選択肢よりもこのアプローチの利点をよりよく説明するために、私の答えを編集しました。 – mikepurvis

+0

私はあなたが良く見えないと言っているわけではありません。セマンティックでエレガントです。しかし、あなたがOLのような図書館を広げようとすると、大会にこだわることで、後に頭が痛くなります。このような砂糖は、より多くの "つまらない" –

関連する問題