2011-08-07 3 views
4

저는 최근 CoffeeScript http://jashkenas.github.com/coffee-script/에 대한 읽기를 시작했으며 정말 멋져 보입니다! 그러나 외부 JavaScript apis에 액세스/사용하는 쉬운 방법이 있는지 파악할 수 없습니다. 나는 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 
}); 

로 컴파일 자바 스크립트 코드와 동일합니다.

+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" 

편집 : 그냥 클래스를 포장하기 위해, 두 가지 대안을 명확히 이런 식으로 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 
     ... 
    ... 

달리, 커피 스크립트 클래스를 사용하지만 OpenLayers 클래스 않은 장식 연장 : 커피 스크립트에있는 그대로 OpenLayers 클래스 시스템을 사용

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

이러한 방법 중 어느 것 오픈 레이어 (OpenLayers) 또는 커피 스크립트 (CoffeeScript) 중 하나 인 다른 개발자들에게는 관용적이거나 인식할만한 사람이어야합니다. OpenLayers 생성자를 호출 할 때 네이티브 super() 사용을 허용하는 래퍼를 추천합니다.

+0

불필요한 복잡성과 오버 헤드가 추가되는 것 같습니다 (두 번 반복됩니까?). 또한 OL API/소스는 언제든지 코드를 강력하게 변경시킬 수 있습니다. IMHO 상속 시스템에 내장 된 OL은 완벽하게 훌륭하며 추상화 할 이유가 없습니다. –

+1

나는 동의하지 않는다. 두 가지 대안보다이 접근법의 이점을 더 잘 설명 할 수 있도록 내 대답을 편집했습니다. – mikepurvis

+0

나는 너의 모습이 나아지지 않는다는 말은 아니다. 그것은 의미 론적이고 우아합니다. 그러나 OL과 같은 라이브러리를 확장하기 시작하면 컨벤션에 집착하는 것이 나중에 많은 머리를 아프게합니다. 이런 설탕은 더 많은 "잡았다" –

관련 문제