对于问题缺乏准确性表示抱歉,但我不完全确定我在这里做错了多少可能做错的事情。
我对Coffeescript和一般的地理应用程序都比较新,但是这里有:
我在客户端和服务器上都有一个使用coffeescript的工作(简单)Meteor(.7.0.1)应用程序。当我尝试利用TopoJSON编码文件创建一个美国国会选区时,我遇到了这个问题。 (该应用程序的目的是帮助突出美国的选民压制)
所以,有一些事情:通常在非Meteor应用程序中,我只会像这样加载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,然后将内容(当然只是一个对象)设置为等于a变量。
这是我做的:
首先,我将.json文件更改为服务器目录中的.js文件,并将“congress =”添加到文件的开头。这是一个巨大的文件,请原谅我省略整个对象。
congress = {"type":"Topology",
"objects":
{"districts":
{"type":"GeometryCollection","geometries":[{"type":"Polygon"
现在这里的一切都开始给我带来问题:
在server.coffee中,我创建了一个这样的变量来引用congress对象:
@congress_geojson = topojson.feature(congress, congress.objects.districts)
注意我是如何将@符号放在那里的?我被告知这允许Coffeescript中的变量是全局范围的吗?我还尝试使用名为“share”的Meteor功能,其中我将变量声明为“share.congress_geojson”。这导致了我将在下面描述的相同问题。
现在在client.coffee文件中,我正在尝试调用此变量加载到Leaflet映射中。
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)
我毫不怀疑我在这里遗漏了一些愚蠢的东西。任何建议或提示我正在做的完全错误将不胜感激。是否在.cs文件中全局声明的对象不可用于.coffee文件中的代码?也许我在Meteor方面做错了什么?
谢谢!
编辑:
所以我能够通过将包含congress对象的.js文件放在root / lib文件夹中来使事情工作,导致首先加载对象,然后从客户端调用congress对象。但是,我仍然想知道如何从服务器上简单地共享这个对象?什么是“流星之路”?
答案 0 :(得分:0)
如果您正在寻找 Meteor 方式订购加载文件,请使用Meteor.startup
function并将初始化代码放在那里。该函数是Meteor世界的$.ready
,即只有在客户端上成功加载所有文件后才会执行。
所以在你的情况下:
Meter.startup ->
congress_layer.addData(@congress_geojson)