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

使用coffeescript构建的Meteor应用程序中的topjson对象出现问题,coffeescript,meteor,topojson,Coffeescript,Meteor,Topojson,我为这个问题的不精确表示歉意,但我不完全确定我在这里做的很多事情中哪些是错的 我对Coffeescript和geo应用程序还比较陌生,但这里有: 我有一个简单的Meteor.7.0.1应用程序,在客户端和服务器上都使用coffeescript。我遇到的问题发生在试图利用TopoJSON编码的文件创建一层美国国会选区时。该应用程序的目的是帮助凸显美国选民受到的压制 所以,有几件事:通常在非Meteor应用程序中,我会像这样加载topoJSON文件: $.getJSON('./data/us-con

我为这个问题的不精确表示歉意,但我不完全确定我在这里做的很多事情中哪些是错的

我对Coffeescript和geo应用程序还比较陌生,但这里有:

我有一个简单的Meteor.7.0.1应用程序,在客户端和服务器上都使用coffeescript。我遇到的问题发生在试图利用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,然后设置内容,当然,这些内容只是一个对象,等于一个变量。 以下是我所做的:

首先,我将服务器目录中的.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\u geojson。这导致了我将在下文描述的相同问题

现在在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文件中的代码吗?也许我在流星方面做错了什么

谢谢

编辑:


因此,我可以通过将包含congress对象的.js文件放在根/lib文件夹中,首先加载该对象,然后从客户端调用congress对象来实现。但是,我仍然想知道如何从服务器上简单地共享这个对象?流星是怎么来的

如果您正在寻找Meteor方法来订购文件加载,请使用并将初始化代码放在那里。该函数是Meteor world的核心功能,也就是说,只有在所有文件成功加载到客户端之后,它才会执行

因此,在你的情况下:

Meter.startup-> 第二层。addData@congress_geojson
您可以首先尝试在client.coffee文件中定义congress_geojson`以确认这是一个范围问题。还有,功能来自哪里?我在您的代码中看不到这一点,那么它引用了哪个库呢?Serkan,features是由congress对象上运行的topojson.feature函数返回的。此外,已尝试在客户端中定义。没有骰子。@symbol在那里?有人告诉我这允许Coffeescript中的变量被全局限定范围?不,@只是一个别名,它可能指也可能不指全局上下文。不幸的是,Meteor.startup在这里没有帮助我,原因很简单,它根据所在位置做不同的事情。在客户端,它在加载DOM时运行,而在服务器上,它在移动文件时运行。我的问题是,我无法访问服务器上的变量,因为从非常大的json文件创建的对象在加载客户端DOM时没有完全加载。解决方案是将包含这些对象的.js文件放在/lib文件夹中,这使它们在加载顺序中具有优先权。