2011-09-23 126 views
1

我想把标记放在地图上。源是一个json请求,返回城市。回调回调

我有一个返回记录(异步)和函数(谷歌地图API)的函数(sencha),返回特定城市(异步)和方法(谷歌地图)的lng,lat,地图上的标记。

结果应该是地图上由谷歌计算的位置上的标记,并从记录中检索到标题。

负荷记录

offers = App.stores.offers.load({ 
    callback: function(records, operation, success){...} 
}) 

获取地点

geocoder = new google.maps.Geocoder(); 
geocoder.geocode(
    {'address': adress}, 
    function(results, status) {...} 
} 

,并设置标志

marker = new google.maps.Marker({ 
    map: map, 
    position: loc, 
    title: text 
}); 

我wan't什么做的是,加载记录,循环每个记录,了解城市的位置并在那里放置一个标记。

同步,我会做:

records = App.stores.offers.load(); 
    for (var i=0; i < records.length; i++) { 
    setMarker(map, getLocation(records[i].data["city"]), cords[i].data["text"]); 
    } 

什么是与异步功能把它一起的正确方法?

回答

0

我真的不知道App.stores.offers.load函数做了什么,但我会假设它的回调函数参数在记录变量中包含加载结果。在这种情况下,循环遍历回调函数中的记录以及每个调用地理编码,以及地理编码的回调位置标记(没有任何问题)。

编辑:这是未经测试,可能不是最有效的,但应该工作:

offers = App.stores.offers.load({ 
    callback: function(records, operation, success){ 
     if (success) {//or sth like this 
      var complete; 
      for (var i = 0; i < records.length; i++) { 
       complete = false; 
       geocoder.geocode({'address': records[i].adress}, 
        function(results, status) { 
        if (status == google.maps.GeocoderStatus.OK) { 
         map.setCenter(results[0].geometry.location); 
         var marker = new google.maps.Marker({ 
          map: map, 
          title: results[i].text, 
          position: results[0].geometry.location 
         }); 
        } else { 
         alert("Geocode was not successful for the following reason: " + status); 
        } 
        complete = true; 
       }); 
       while (!complete); 
      } 
     } 
    } 
}); 
+0

其实那是我第一次的猜测太多,但如果我需要记录[I]的.text设置标记标题文本,这是不行的.. – Beffa

+0

你不是很清楚你需要什么,我会尽量弄清楚 – slawekwin

+0

为什么要结果[i]存储文本?因为它是异步的,“i”在“geocode”的回调中不是你期望的回调,所以很可能是records.length,因为循环比从google回来的响应快很多。 – Beffa

0

在我的ExtJS /煎茶实现它的结束。我遇到的第二个问题是Google地图服务的限制(我有很多配额超出例外)。所以这不完全是问题的答案。所以我将其他答案标记为正确,因为它更接近问题。无论如何,我最终得到的代码可以帮助某人。

App.stores.offers = new Ext.data.Store({ 
model: 'Offer', 
(...) 

listeners: { 
    load: function(store, records, success){ 
    this.addEvents("refresh_locations", "locations_updated"); 
    for (var i=0; i < store.data.length; i++) { 
    store.fireEvent("refresh_locations", store , store.getAt(i), "load"); 
    } 
}, 
refresh_locations: function(store, record, method){ 
    if (record.get("location") == null || record.get("location") == ""){ 
    Ext.Ajax.request({ 
     url: 'api/partner2sport/find_location', 
     params: { 
     "city" : record.get("place") 
     }, 
     success: function(response, options) { 
     db_check = Ext.decode(response.responseText)["success"]; 
     if (db_check){ 
      var latlngStr = Ext.decode(response.responseText)["location"].replace(/\(|\)/g,"").split(",",2) 
      var lat = parseFloat(latlngStr[0]) - (Math.random()/100); 
      var lng = parseFloat(latlngStr[1]) - (Math.random()/100); 
      var latlng = new google.maps.LatLng(lat, lng); 
      record.set("location", latlng); 
     }else{ 
      geocoder = new google.maps.Geocoder(); 
      geocoder.geocode(
      { 
       'address': record.get("place") 
      }, 
      function(results, status) { 
       if (status == google.maps.GeocoderStatus.OK) {    
       record.set("location", results[0].geometry.location); 
       Ext.Ajax.request({ 
        url: 'api/partner2sport/set_location', 
        params: { 
        "city" : record.get("place"), 
        "location": record.get("location") 
        } 
       }); 
       } 
      } 
     ); 
     } 
     }, 
     failure: function(response, options) { 
     console.log("bad request"); 
     } 
    }); 
    } 
}, 

(...)

+0

以及您如何验证您收到了哪个位置地理编码结果? – slawekwin

+1

请问你可以发布代码吗? – SteveCav