EDITED :问题在于'find_callback'函数,我想将每个响应插入名为responseArray的全局数组中。响应是一个对象数组。
我正在尝试从一系列搜索中为OpenLayers的Waze实现添加标记。我想运行多个搜索,累积结果。我使用了3个函数,onInit()
,find_callback()
和addPoint()
。调用'find_callback'函数会覆盖先前的标记。如果我进行一次搜索:
g_wzae_map.find('THE LOCATION', 'find_callback');
回复:
/* array of search results (up to 10) sorted by relevancy */
[ {
//bounds that contain the this map feature (set map to this extent for closest zoom)
"bounds":{"bottom":32.0880470275879,
"left":34.7883338928223,
"right":34.7912673950195,
"top":32.0854721069336},
//location of the feature
"location":{"lat":32.08560397003471,"lon":34.78999763465419},
//name of feature
"name":"Street, City"
},
//up to 9 more results
// ...
]
代码
function addPoint(response){
var first_result = response;
var lon = first_result.location.lon;
var lat = first_result.location.lat;
map.setCenter(new OpenLayers.LonLat(lon,lat));
var markersPoint = new OpenLayers.Layer.Markers( "Markers" );
markersPoint.addMarker(
new OpenLayers.Marker(
new OpenLayers.LonLat(
lon,
lat
),
icon.clone()
)
);
g_waze_map.map.addLayer(markersPoint);
map.addPopup(
new OpenLayers.Popup.FramedCloud(
"point_"+first_result.location.lat,
new OpenLayers.LonLat(lon,lat),
null,
"<div style='font-family:Arial,sans-serif;font-size:0.8em;'>"
+first_result.name+"<div>",
anchor=null,
true,
null
)
);
}
//called when map loads
function onInit(){
map = g_waze_map.map;
size = new OpenLayers.Size(15, 20);
offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
icon = new OpenLayers.Icon('http://www.waze.co.il/images/home.png',size,offset);
// array for the points
responseArray = new Array();
// find callback
find_callback = function(response){
for (var i=0, length = response.length; i<length; i++){
responseArray.push(response[i]);
}
// alert(responseArray[0]); // working, getting an object
}
// alert(responseArray[0]); // not working, getting 'undefined'
//search API example, calls 'find_callback' when search returns
g_waze_map.find('Turin','find_callback');
g_waze_map.find('Rome','find_callback', true);
// adding the points
for (var i=0, length = responseArray.length; i<length; i++){
addPoint(responseArray[i]);
}
};
谢谢!
答案 0 :(得分:1)
g_waze_map.find()
是asynchronous,这就是它使用回调来处理结果的原因。当find
返回时,搜索结果可能不可用。而不是从addPoint
调用onInit
,而是直接在find_callback
。
find
将搜索结果加载到另一个页面中,该页面可能会将结果存储为全局变量,以便在以后的调用重新加载页面时被破坏(请参阅为什么全局变量不好?)。如果是这种情况,您可以将除find
的第一个电话之外的所有电话移至find
回拨。
//called when map loads
function onInit(){
var map = g_waze_map.map;
var size = new OpenLayers.Size(15, 20);
var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
var icon = new OpenLayers.Icon('http://www.waze.co.il/images/home.png',size,offset);
function addPoint(response){
var first_result = response;
var lon = response.location.lon;
var lat = response.location.lat;
//g_waze_map.map.setCenter(new OpenLayers.LonLat(lon,lat));
var markersPoint = new OpenLayers.Layer.Markers( "Markers" );
markersPoint.addMarker(
new OpenLayers.Marker(
new OpenLayers.LonLat(lon, lat),
icon.clone()
) );
g_waze_map.map.addLayer(markersPoint);
g_waze_map.map.addPopup(
new OpenLayers.Popup.FramedCloud(
"point_"+lat, new OpenLayers.LonLat(lon,lat), null,
"<div style='font-family:Arial,sans-serif;font-size:0.8em;'>"+response.name+"<div>",
null, true, null
) );
}
// array for the points; this could be dropped
var responseArray = [];
function addPoints(response) {
// if you want to save the responses for other purposes
Array.push.apply(responseArray, response);
for (var i=0, length = response.length; i<length; i++){
addPoint(response[i]);
}
}
var terms = ['Rome'];
window.find_callback = function(response){
addPoints(response);
if (terms.length) {
g_waze_map.find(terms.pop(),'find_callback', true);
}
}
g_waze_map.find('Turin','find_callback');
};