CoffeeScript с другими библиотеками - PullRequest
4 голосов
/ 07 августа 2011

Я недавно начал читать о CoffeeScript http://jashkenas.github.com/coffee-script/, и это выглядит совершенно потрясающе! Однако я не могу понять, есть ли простой способ получить доступ / использовать внешние API JavaScript. Я широко использую OpenLayers, поэтому кто-то может показать мне, как следующий фрагмент кода будет написан на CoffeeScript?

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

Ответы [ 2 ]

3 голосов
/ 24 октября 2011

Одна небольшая ошибка, о которой следует знать, это то, что объектная система в OpenLayers использует функцию initialize () в качестве конструктора, поэтому, чтобы супер-ключевое слово CoffeeScript работало правильно при расширении классов OpenLayers, вам необходимо декорировать их. Для этого я использую следующую функцию:

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.

2 голосов
/ 07 августа 2011

У вас есть немного гибкости в том, сколько синтаксиса вы используете, но я бы написал так:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...