Как вы возвращаете значения из функций javascript

Я использую библиотеку js в Dart для доступа к OpenLayers. Соответствующий код выглядит так:

js.scoped(() {
  ol = js.retain(js.context.OpenLayers);
  var max_extent = new js.Proxy(ol.Bounds, -13652354.432172, 6026153.418145, -13574082.915218, 6065289.1766216);
  var restricted_extent = max_extent;

  if (controls == null){

    var options = js.map ({
      'maxExtent': max_extent,
      'restrictedExtent' : restricted_extent,
      'units' : 'm',
      'projection': new js.Proxy(ol.Projection, 'EPSG:900913'),
      'displayProjection' : new js.Proxy(ol.Projection, 'EPSG:4326'),
      'controls' : js.array([ new js.Proxy(ol.Control.Attribution),
                              new js.Proxy(ol.Control.Navigation),
                              new js.Proxy(ol.Control.ArgParser),
                              new js.Proxy(ol.Control.PanPanel),
                              new js.Proxy(ol.Control.ZoomPanel)
                             ])
    });
    _treemap = js.retain( new js.Proxy( ol.Map, map_div_id, options ) );
  }

  var roads = new MapLayer(ol, layer_type:'road').layer;
  var aerial = new MapLayer(ol, layer_type:'hybrid').layer;

  _treemap.addLayers(js.array([roads, aerial]));
  _treemap.setBaseLayer(roads);
  _treemap.zoomToMaxExtent();
  var result = _treemap.layers();
});

Все работает как положено, кроме последней строки. _treemap.layers() должен возвращать массив OpenLayer.Layer. Когда эта строка выполняется, я получаю сообщение об ошибке:

Исключение: TypeError: объект [массив объектов] не имеет метода «применить»

Итак, как правильно получить/обработать возвращаемые значения из функций javascript в моем коде Dart?


person Alan Humphrey    schedule 26.02.2013    source источник


Ответы (1)


layers — это массив (см. OpenLayers.Map.layers). Итак, вы должны использовать:

var result = _treemap.layers;

С помощью _treemap.layers() вы пытались вызвать layers, поскольку это была функция.

Одно примечание к вашему коду: когда вы используете js.map({}), вам не нужно использовать js.array или js.map в дереве объектов. Вы можете просто создать структуру, подобную JSON.

var options = js.map ({
  'maxExtent': max_extent,
  'restrictedExtent' : restricted_extent,
  'units' : 'm',
  'projection': new js.Proxy(ol.Projection, 'EPSG:900913'),
  'displayProjection' : new js.Proxy(ol.Projection, 'EPSG:4326'),
  'controls' : [ new js.Proxy(ol.Control.Attribution),
                 new js.Proxy(ol.Control.Navigation),
                 new js.Proxy(ol.Control.ArgParser),
                 new js.Proxy(ol.Control.PanPanel),
                 new js.Proxy(ol.Control.ZoomPanel)
               ])
});
person Alexandre Ardhuin    schedule 27.02.2013