2012-04-27 64 views
4

我試圖用ClojureScript重寫OpenLayers的示例用法。ClojureScript + OpenLayers

JavaScript源代碼如下所示:

var map, layer; 
map = new OpenLayers.Map('map'); 
layer = new OpenLayers.Layer.OSM("Simple OSM Map"); 
map.addLayer(layer); 

var projection = new OpenLayers.Projection("EPSG:4326"); 
var center = new OpenLayers.LonLat(-71.147, 42.472).transform(projection, map.getProjectionObject()); 
map.setCenter(center, 12); 

我已經改寫了這個代碼:

(ns hello.map) 
    (def mapp (.Map js/OpenLayers "map")) 
    (def layer (.Layer.OSM js/OpenLayers "Simple OSM Map")) 
    (.addLayer mapp layer) 

    (def projection (.Projection js/OpenLayers "EPSG:4326")) 
    (def center (.Transform (.LonLat js/OpenLayers -71.147 42.472) projection (.getProjectionObject mapp))) 
    (.setCenter mapp center 12) 

雷音產生下面的代碼:

var hello = {map:{}}; 
hello.map.mapp = OpenLayers.Map("map"); 
hello.map.layer = OpenLayers.Layer.OSM("Simple OSM Map"); 
hello.map.mapp.addLayer(hello.map.layer); 
hello.map.projection = OpenLayers.Projection("EPSG:4326"); 
hello.map.center = OpenLayers.LonLat(-71.147, 42.472).Transform(hello.map.projection, hello.map.mapp.getProjectionObject()); 
hello.map.mapp.setCenter(hello.map.center, 12); 
hello.hello = {}; 

而且它不工作。那麼問題在於ClojureScript生成的代碼沒有new或者其他的東西?

+0

我真的不知道,但是你是否首先在你的cljs中創建了需要的js對象? – georgek 2012-04-27 15:48:12

回答

6

是你的構造函數調用需要修正:

(ns hello.map) 

(def mapp (js/OpenLayers.Map. "map")) 
(def layer (js/OpenLayers.Layer.OSM. "Simple OSM Map")) 
(.addLayer mapp layer) 

(def projection (js/OpenLayers.Projection. "EPSG:4326")) 
(def center (.transform (js/OpenLayers.LonLat. -71.147 42.472) 
       projection (.getProjectionObject mapp))) 
(.setCenter mapp center 12) 

未經測試,但你應該明白我的意思。請注意在實例上構造實例和調用方法之間的區別。

+0

謝謝!這個代碼是我需要的,它的工作原理! – 2012-05-07 17:50:41