0

これがCoffeescriptで機能しない理由がわかりません。この例を単純化しようとしました: http://openlayers.org/dev/examples/click-handler.html

ビューには、ID マップを含む div があり、initMap() を呼び出します。

私が得たエラーは次のとおりです。

 TypeError: a.draw is not a function

openlayers lib の途中

.js.coffeescript ファイルで次のコードを取得しました。

@MarkOnce = OpenLayers.Class OpenLayers.Control,
defaultHandlerOptions:
  'single': true
  'double': false
  'pixelTolerance': 0
  'stopSingle': false
  'stopDouble': false

initialize: ->
  this.handlerOptions = OpenLayers.Util.extend({}, this.defaultHandlerOptions)
  OpenLayers.Control.prototype.initialize.apply(this, arguments)
  this.handler = new OpenLayers.Handler.Click(this, {'click': this.mark},     this.handlerOptions)

mark: (evt) ->
  console.log 'mark'
  alert('pan')


 default_marker = (lonlat) ->
   size = new OpenLayers.Size(21,25)
   offset = new OpenLayers.Pixel(-(size.w/2), -size.h)
   icon = new OpenLayers.Icon('http://www.openlayers.org/dev/img/marker.png',size,offset)
   marker = new OpenLayers.Marker(lonlat,icon)
return marker

  @initMap = (lon,lat,marker) ->
    @map = load_map(lon,lat)
    render_marker(@map,lon,lat) if marker
    set_projection(@map,lon,lat)
    set_callbacks(@map)

 load_map = (lon,lat) ->
   map = new OpenLayers.Map 'map'
   layer = new OpenLayers.Layer.OSM()
   map.addLayer(layer)
   map

 set_projection = (map, lon, lat) ->
   projection = new OpenLayers.Projection("EPSG:4326")
   point = new OpenLayers.LonLat(lon,lat)
   console.log(point)
   center = point.transform(projection, map.getProjectionObject())
   map.setCenter(point, 5)

 render_marker = (map,lon,lat) ->
   layer_once = new OpenLayers.Layer.Markers("mark_once")
   map.addLayer(layer_once)

   lonlat = new OpenLayers.LonLat(lon,lat)
   layer_once.addMarker(@default_marker(lonlat))
   @numMarkers++

 set_callbacks = (map) ->
   click = new MarkOnce()
   map.addControl(click)
   click.activate()

編集: {draw: -> alert 'pan'} の this.defaultHandlerOptions を変更すると、機能するようです。問題は次のとおりです。この範囲で何が起こっているのでしょうか。これは何ですか"?

EDIT2: このアボードジで考えられる問題の 1 つは、マップをズームアウトまたはズームインすると、マーカーがマップの中央に配置されることです。これを回避するにはどうすればよいですか?

EDIT3: この時点まで来たら、何をしていても爆破して、リーフレットを使用してください。

4

1 に答える 1

2

OpenLayers.Control と OpenLayers.Handle.Click から OpenLayers.Class を使用してクリックハンドラーを作成する CoffeeScript で同じ問題が発生しましたが、それは必要ではないようです。

ここで OpenLayers / jQuery の競合がありますか? を参照してください。 マップのコンストラクターのオプションパラメーターでイベントリスナーを非常に簡単に確立する方法について。それは私にとってはうまくいきました。

于 2013-10-31T00:30:20.730 に答える