2014-02-20 66 views
1

道歉缺乏精確度的問題建立了一個流星應用一個topjson對象,但我不能完全確定,其中可能很多事情我做錯了這裏。問題與在CoffeeScript中

我是比較新的的CoffeeScript和一般還地理應用程序,但在這裏有雲:

我有一個工作(簡單)流星(.7.0.1)應用程序利用客戶端和服務器的CoffeeScript 。我試圖利用TopoJSON編碼文件創建美國國會地區圖層時遇到了這個問題。 (該應用程序的目的是幫助美國亮點選民抑制)

所以,幾件事情:通常在非流星的應用程序,我只想加載topoJSON文件像這樣:

$.getJSON('./data/us-congress-113.json', function (data) { 
var congress_geojson = topojson.feature(data, data.objects.districts); 
congress_layer.addData(congress_geojson); 
}); 

現在當然這不會在Meteor中工作,因爲它不是異步的。

這裏推薦的一個東西是不用擔心讀取文件,而是將json文件更改爲.js,然後將內容(當然只是一個對象)設置爲等於一個變量。
下面是我做的:

首先,我將.json文件更改爲服務器目錄中的.js文件,並將「congress =」添加到文件的開頭。這是一個巨大的文件,所以請原諒我省略整個對象。

congress = {"type":"Topology", 
       "objects": 
        {"districts": 
         {"type":"GeometryCollection","geometries":[{"type":"Polygon" 

現在,這裏有這裏的一切開始給我的問題:

在server.coffee,我創建了一個變量,像這樣來引用國會對象:

@congress_geojson = topojson.feature(congress, congress.objects.districts) 

注意如何我在那裏放@符號?我被告知這允許Coffeescript中的變量在全局範圍內?我試圖在我聲明變量爲「share.congress_geojson」時使用名爲「share」的流星功能。這導致了我將在下面描述的相同問題。

現在在client.coffee文件,我想叫這個變量要裝入單張地圖。

congress_layer = L.geoJson(null, 
    style: 
    color: "#DE0404" 
    weight: 2 
    opacity: 0.4 
    fillOpacity: 0.1 
) 

congress_layer.addData(@congress_geojson) 

這不是工作,特別(儘管試圖尋找其他辦法,我越來越控制檯的錯誤是:

Exception from Deps afterFlush function: TypeError: Cannot read property 'features' of  undefined 
at o.GeoJSON.o.FeatureGroup.extend.addData (http://localhost:3000/packages/leaflet.js?ad7b569067d1f68c7403ea1c89a172b4cfd68d85:39:16471) 
at Object.Template.map.rendered (http://localhost:3000/client/client.coffee.js?37b1cdc5945f3407f2726a5719e1459f44d1db2d:213:18) 

我毫不懷疑,我失蹤這裏的東西愚蠢明顯。對於我在做什麼完全錯誤的任何建議或提示,將不勝感激。這是在哪裏.js文件全局聲明的對象不代碼可用在.coffee文件的情況下?也許我在做一些錯誤的流星一邊?

謝謝!

編輯:

所以我能夠得到的東西通過將包含在根/ lib文件夾國會對象.js文件,使物體先加載,然後調用來自國會對象工作客戶。但是,我仍然想知道我可以如何簡單地從服務器分享這個對象?這裏的「流星方式」是什麼?

+0

你可以先嚐試內'client.coffee'文件中定義congress_geojson'確認這是一個範圍的問題。另外,'features'從哪裏來?我沒有看到你的代碼,所以它引用哪個庫?這可能會給你一些額外的線索。 –

+0

Serkan,特徵由在會議對象上運行的topojson.feature()函數返回。此外,已經嘗試在客戶端進行定義。沒有骰子。 – JPKab

+0

「@ symbol there?我被告知這允許Coffeescript中的變量在全局範圍內?」不,「@」只是「this」的別名,可能是也可能不指全局上下文。 –

回答

0

如果您正在尋找文件的流星方式爲了加載,使用Meteor.startup function並把初始化代碼出現。該功能是Meteor世界的$.ready,即只有在所有文件已成功加載到客戶端後,纔會執行該功能。

所以你的情況:

Meter.startup -> 
    congress_layer.addData(@congress_geojson) 
+0

不幸的是,Meteor.startup並沒有幫助我,因爲簡單的原因,取決於它在哪裏,它做了不同的事情。在客戶端中,它在DOM完成加載時運行,而在服務器上,它在文件移動時運行。 我的問題是,我無法訪問服務器上的變量,因爲客戶端DOM被加載時,該對象(它是從一個非常大的json文件創建的)未完全加載。解決方法是將包含對象的.js文件放在/ lib文件夾中,這使得它們成爲加載順序的優先級。 – JPKab