存储功能列表

时间:2011-01-21 17:32:32

标签: flex google-maps

代码

for ( var i:int = 0; i < markers.length; i++ )
{
    markers[i].addEventListener( MapMouseEvent.CLICK, function( e:Event ):void
    {
        markers[i].openInfoWindow( infoWindows[i] );
    });
    map.addOverlay( markers[i] );
}

我有markers数组中的标记列表,以及infoWindow数组中关联的InfoWindowOptions列表。

问题

单击标记并调用匿名函数时,for循环已经完成,i现在等于markers.length。所以我在markers[i]infoWindows[i]上遇到了一个越​​界错误。

我想创建一个关联函数列表并将其存储在一个数组中。所以我可以做这样的事情:

for ( var i:int = 0; i < markers.length; i++ )
{
    markers[i].addEventListener( MapMouseEvent.CLICK, markerListeners[i] );
}

所以我需要知道的是,

  • 如何在数组中存储函数引用列表?
  • 有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

  

有更好的方法吗?

我将尝试更好的方法来做到这一点。首先,最好避免每个人在addEventListener中放置一个匿名函数,因为你将无法删除那些监听器而且它不会被垃圾收集 - 所以你的应用程序会有内存泄漏。

话虽如此,Dictionary对于这个目的来说是完美的。

而不是维护两个单独的数组并尝试将它们链接在一起,词典的关键:值语法将大大简化您的工作流程。

首先你应该设置你的词典:

var markersDictionary:Dictionary = new Dictionary(true);

//you didn't show how you create your arrays so I'm showing
//you how to create a dictionary manually.
//this can also be done in a loop
markersDictionary[marker] = new InfoWindow(); // This should be whatever is in your infoWindows array
markersDictionary[marker] = new InfoWindow();
markersDictionary[marker] = new InfoWindow();

现在添加监听器:

for(var key:Object in markersDictionary)
{
  var marker:Marker = markersDictionary[key];
  marker.addEventListener(MouseMapEvent.CLICK, markerClickhandler, false, 0, true);
  //...false, 0, true is for weak event listeners, you should get in
  // the habit of always doing this unless you have a reason to otherwise.
{

当然您需要定义markerClickhandler

function markerClickhandler(event:MouseMapEvent):void
{
  var marker:Marker = event.target as Marker;

  marker.openInfoWindow(InfowWindow(markersDictionary[marker]);
}

答案 1 :(得分:0)

  

有更好的方法吗?

好问题。标记应该是MapMouseEvent的目标,因此您可以使用常规函数并按目标区分标记。

答案 2 :(得分:0)

为了避免边界错误,您需要获取i而不是引用,该引用将保存在您的匿名处理函数中。我确信有一种更优雅的方式来实现这一点,而不是以下,但这就是我要做的诀窍:

    for ( var i:int = 0; i < markers.length; i++ )
    {
        markers[i].addEventListener( MapMouseEvent.CLICK, createMapMouseEventHandler(i));
        map.addOverlay( markers[i] );
    }
    ...
}

private function createMapMouseEventHandler(index:int):Function
{
    return function( e:Event ):void
        {
            markers[index].openInfoWindow( infoWindows[index] );
        }
}

注意:如果markers和/或infoWindows超出了createMapMouseEventHandler的范围,则需要将它们作为参数传递。