1

Openlayersマップイベントに反応したいのですが、イベントが発行されたときにクラスメソッドを呼び出すのに問題があります。関連するコードスニペットは次のようになります。

function OpenLayersMap(divname) {
  var osmLayer = new OpenLayers.Layer.OSM("Open Street Maps");
  var gmLayer = new OpenLayers.Layer.Google("Google Maps");

  this.proj = new OpenLayers.Projection("EPSG:4326");
  this.map = new OpenLayers.Map(
  {
    div: divname,
    allOverlays: false,
    theme: null,
    controls: 
    [
      new OpenLayers.Control.Attribution(),
      new OpenLayers.Control.Navigation(),
      new OpenLayers.Control.LayerSwitcher(),
      new OpenLayers.Control.PanZoomBar(),
      new OpenLayers.Control.ScaleLine(),
      new OpenLayers.Control.MousePosition(
        {
          displayProjection: this.proj
        }
      ),
      new OpenLayers.Control.KeyboardDefaults()
    ],
    eventListeners: 
    {
      'moveend' : this.moved,
      'zoomend' : this.zoomed
    }
  }
  );
  this.map.addLayers([osmLayer, gmLayer]);
  this.map.setCenter(new OpenLayers.LonLat(8.56, 50).transform(
    this.proj, 
    this.map.getProjectionObject()), 
    10
  );
  this.updateMapData();
}

OpenLayersMap.prototype = {
  constructor : OpenLayersMap,

  updateMapData : function() {
    console.log("updateMapData!!!!!!!!");
    // Some more stuff
  },

  moved : function(event) {
    console.log("Map has been moved!");
    this.updateMapData(); // Line 94
  },

  zoomed : function(event) {
    console.log("Zoom has been used!");
    this.updateMapData();
  }
}

ページを読み込んだ後のfirebugの出力:

Map has been moved!
Uncaught Type error: Object #<Object> has no method 'updateMapData'
Map has been moved!
Uncaught Type error: Object #<Object> has no method 'updateMapData'
   OpenLayersMap.moved (ol.js:94)
   OpenLayers.Events.OpenLayers.Class.triggerEvent (OpenLayers-2.11-min.js:400)
   OpenLayers.Map.OpenLayers.Class.moveTo (OpenLayers-2.11-min.js:499)
   OpenLayers.Map.OpenLayers.Class.setCenter (OpenLayers-2.11-min.js:473)
   OpenLayers.Map.OpenLayers.Class.updateSize (OpenLayers-2.11-min.js:464)
   (anonymous function) (OpenLayers-2.11-min.js:158)

したがって、movedメソッドは呼び出されますが、updateMapDataメソッドは呼び出されません。eventListeners部分を削除すると、コンストラクター側でのupdateMapData呼び出しは成功します。

メソッドを呼び出せない理由を誰かに教えてもらえますか?

前もって感謝します!

4

1 に答える 1

1

問題の解決策を見つけましたが、問題の内容が完全にはわかりません。私の解決策にコメントするか、より良い解決策で答えてください。

var self = this;
//...
eventListeners: 
{
  'moveend' : function(event) { self.moved(event); },
  'zoomend' : function(event) { self.zoomed(event); }
}
//...

オブジェクトが作成されたときに、OpenLayersMap のプロトタイプ メソッド (移動など) が不明であると思われます。

于 2012-10-18T07:54:10.163 に答える