使用coffeescript构建的Meteor应用程序中的topjson对象问题

时间:2014-02-20 15:52:58

标签: coffeescript meteor topojson

对于问题缺乏准确性表示抱歉,但我不完全确定我在这里做错了多少可能做错的事情。

我对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对象。但是,我仍然想知道如何从服务器上简单地共享这个对象?什么是“流星之路”?

1 个答案:

答案 0 :(得分:0)

如果您正在寻找 Meteor 方式订购加载文件,请使用Meteor.startup function并将初始化代码放在那里。该函数是Meteor世界的$.ready,即只有在客户端上成功加载所有文件后才会执行。

所以在你的情况下:

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