我有一个场景,用户可以存储他们的映射样式。当用户用地图导航回该页面时,它应该以以前的方式显示地图。
用户可以更改地理颜色和边框,以及根据人口统计信息应用主题样式。
随着新loadGeoJson的发布,我在加快我的应用程序方面取得了巨大的成功,最初我是通过JS自己绘制所有地理位置的。这在大约1500个地理位置引起了一些记忆问题。这个新功能大大减少了它。我选择在服务器端生成功能对象,并将一个URL传递给地图以供呈现。此URL与所有其他样式信息一起传入,以重新构建以前的地图。
我遇到的问题是,当我尝试应用这些样式时,地图还没有检索到要在地图上显示的功能列表。
纵观文档化,我没有看到专门针对loadGeoJson方法的任何事件,但确实看到了addFeatureandset几何学,但是在使用loadGeoJson方法时,这些事件都不会被引发。
所有这些都是用类型记录编写的,并试图遵循一种非常严格的MVVM方法,使用Knockout通过绑定为我处理所有UI更改。
是否有另一个事件我可以绑定以查看此方法何时完成,以便我可以适当地应用我的样式?
还有什么办法可以让我在某个地方“等着”吗?
发布于 2014-04-15 08:44:42
您可以侦听addFeature
事件,该事件将为json中的每个特性触发。例如,如果使用https://storage.googleapis.com/maps-devrel/google.json,则在json请求完成后引发6个事件,即当google开始从json文件中添加特性时:
您可以在这里看到演示:http://jsbin.com/ofutUbA/4/edit
发布于 2015-06-24 12:21:07
addfeature肯定是由loadGeoJson调用的,如果不是针对您的,则是一些设置错误。
loadGeoJson有一个可选的回调参数,在加载所有特性之后调用什么,并将这些特性作为参数。
https://developers.google.com/maps/documentation/javascript/3.exp/reference
loadGeoJson(url:string,options?:Data.GeoJsonOptions,回调?:function(Array))
您可以通过此回调向您的代码发出信号,表示它可以继续处理。
map.data.loadGeoJson('google.json', null, function (features) {
map.fitBounds(bounds); // or do other stuff what requires all features loaded
});
您还可以将loadGeoJson封装到一个承诺中,并在loadGeoJson的回调中解决这个承诺。
function loadGeoJson(url, options) {
var promise = new Promise(function (resolve, reject) {
try {
map.data.loadGeoJson(url, options, function (features) {
resolve(features);
});
} catch (e) {
reject(e);
}
});
return promise;
}
// Somewhere else in your code:
var promise = loadGeoJson('studs.json');
promise.then(function (features) {
// Do stuff
});
promise.catch(function (error) {
// Handle error
});
发布于 2014-04-15 08:05:11
如果您使用的是“敲除”,您可能会假设可能绑定到某些侦听器,或者将侦听器附加到某个事件。
大多数通过JavaScript的事件总是有一个回调函数,这是一个很好的实践,因此一旦一个函数完成了一些长的I/O
或Database
查询,它就会立即执行该函数。很明显,回调将由您定义。
someLongTimeFunction(function (data) {
// usually this callback will be fired when the function has finished.
});
如果您熟悉敲除,那么您就会知道,一旦数据被检索并通过observable
传递,observable
将更新其绑定。
下面是扩展可观测数据的链接:敲除js
据我从您的问题中所能理解的,这个loadGeoJson
是服务器端吗?如果是这样的话,您将从客户端进行一次长时间的民意调查,并将其与此结合起来:
function doRequest() {
var request = $.ajax({
dataType: "json",
url: 'loadGeoJson',
data: data,
});
request.done(function(data, result) {
if (result !== "success") {
setTimeout(doRequest, 10000);
}
});
}
https://stackoverflow.com/questions/23071590
复制相似问题