google在循环中映射api v3 directions_changed事件

时间:2013-05-15 12:48:06

标签: google-maps-api-3 callback

我的路线是多个子路线的组合。 (通过子路线我的意思是多个DirectionsRenderer对象)

我还有一个循环,我遍历所有DirectionsRenderer对象并将“directions_changed”事件附加到所有这些对象。

不幸的是,当我尝试测试拖动折线时会发生什么情况时,最后一个DirectionsRenderer对象会触发事件。

以下是我的代码的一部分:

for(var k=0; k<directionsRenderers.length; k++)
{

     var directionsRenderer = directionsRenderers[k];
     var a = registerDirectionsChangedEvent(k,directionsRenderer);  
}


function registerDirectionsChangedEvent(index, directionsRenderer)
{
    this.index = index;
    this.directionsRenderer = directionsRenderer;

    var that = this;
    var a = google.maps.event.addListener(this.directionsRenderer, "directions_changed", function()
    {
       var newStopPoint;
       var directionsResult = that.directionsRenderer.getDirections();
       var route = directionsResult.routes[0];
       var legs = route.legs;
       var legsIndex = 0;

       for(var i=0; i<legs.length; i++)
       {
          var cLeg = legs[i];
          var viaWaypoints = cLeg.via_waypoints;
          if(viaWaypoints.length > 0)
          {
             newStopPoint = viaWaypoints[0];
             if(that.index === 1) legsIndex += 9;
             else if(that.index === 2) legsIndex += 18;

             break;
          }
          legsIndex++;
      }

      addNewStopPoint(newStopPoint,legsIndex);
   });

    return a;
}

正如我上面提到的,不仅最后一个DirectionsRenderer对象被触发,而且最后一个事件之前的对象没有实现默认行为。

也许你注意到我使用了:

this.index = index;
this.directionsRenderer = directionsRenderer;

var that = this;

没有它的事件它仍然无效。

我还尝试使用在循环内创建的函数,如下所示:

(function someFunction(a,b){//do something here})(a,b);

但仍然没有运气!

有关如何使其有效的任何建议吗?

1 个答案:

答案 0 :(得分:0)

使用函数闭包,这可能是重复的(未经测试):

for(var k=0; k<directionsRenderers.length; k++)
{
     var directionsRenderer = directionsRenderers[k];
     var a = registerDirectionsChangedEvent(k,directionsRenderer);  
}


function registerDirectionsChangedEvent(index, directionsRenderer)
{
    var a = google.maps.event.addListener(directionsRenderer, "directions_changed", function()
    {
       var newStopPoint;
       var directionsResult = directionsRenderer.getDirections();
       var route = directionsResult.routes[0];
       var legs = route.legs;
       var legsIndex = 0;

       for(var i=0; i<legs.length; i++)
       {
          var cLeg = legs[i];
          var viaWaypoints = cLeg.via_waypoints;
          if(viaWaypoints.length > 0)
          {
             newStopPoint = viaWaypoints[0];
             if(index === 1) legsIndex += 9;
             else if(index === 2) legsIndex += 18;

             break;
          }
          legsIndex++;
      }

      addNewStopPoint(newStopPoint,legsIndex);
   });

    return a;
}