我有一个用户可以存储他们的地图样式的场景。当用户使用地图导航回该页面时,它应该按照之前的方式显示地图。
用户可以更改地理位置和边框的颜色,也可以根据人口统计信息应用主题样式。
随着新的loadGeoJson的发布,我在加速我的应用程序方面取得了巨大的成功。最初我通过JS自己绘制了所有的地理位置。这导致了大约1500个地理区域的一些内存问题。这项新功能大大降低了它。我选择在服务器端生成Features对象,只是将URL传递给地图进行渲染。此URL与所有其他样式信息一起传递,以重建以前的地图。
我遇到的问题是,当我尝试应用样式时,地图尚未检索要在地图上显示的要素列表。
查看文档我没有看到任何专门针对loadGeoJson方法的事件,但确实看到了addfeature和setgeometry,但是在使用loadGeoJson方法时都没有引发这些事件。
这一切都是用Typescript编写的,并试图遵循一个非常严格的MVVM方法,使用Knockout通过绑定来处理所有UI更改。
是否还有另外一个事件我可以看看这个方法何时完成,所以我可以适当地应用我的风格?
还有另一种方法可以让我在某个地方“等待”吗? 。
答案 0 :(得分:9)
addfeature事件肯定是由loadGeoJson调用的,如果不适合你就是一些设置错误。
loadGeoJson有一个可选的回调参数,在加载所有功能并将功能作为参数后调用。
https://developers.google.com/maps/documentation/javascript/3.exp/reference
loadGeoJson(url:string,options?:Data.GeoJsonOptions, 回调:函数(阵列))
您可以通过此回调发出代码,表明它可以继续处理。
map.data.loadGeoJson('google.json', null, function (features) {
map.fitBounds(bounds); // or do other stuff what requires all features loaded
});
您还可以将loadGeoJson包装到promise中,并在loadGeoJson的回调中解析promise。
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
});
答案 1 :(得分:1)
您可以收听针对json中每个功能触发的addFeature
事件。例如如果您使用https://storage.googleapis.com/maps-devrel/google.json,则在完成json请求之后引发六个事件,即当google api开始添加json文件中的功能时:
您可以在此处查看演示:http://jsbin.com/ofutUbA/4/edit
答案 2 :(得分:0)
如果您使用淘汰赛,可以假设可能绑定到某些侦听器,或者将侦听器附加到事件。
通过JavaScript的大多数事件总是有一个回调函数,这是很好的实践,所以一旦函数完成执行一些长I/O
或Database
查询,它将立即执行该函数。显然回调将由您定义。
someLongTimeFunction(function (data) {
// usually this callback will be fired when the function has finished.
});
如果您熟悉淘汰赛,那么您就会知道,一旦检索到数据并且您通过了observable
observable
将更新其绑定。
以下是扩展可观察量的链接:knockout js
据我所知,这个loadGeoJson
,是服务器端吗?如果是这样,你会从客户端进行一次长时间的调查并与之相关:
function doRequest() {
var request = $.ajax({
dataType: "json",
url: 'loadGeoJson',
data: data,
});
request.done(function(data, result) {
if (result !== "success") {
setTimeout(doRequest, 10000);
}
});
}